본문 바로가기

Programming

QEMU Kernel Debugging Error : packet reply is too long

QEMU 로 x64, ARM 등을 커널디버깅할때 gdb 상에서 target remote IP:PORT 로 붙으면 g' packet reply is too long 이런 에러가 나는경우는 주로 QEMU 의 GDB 서버와 클라이언트 GDB 의 arch 가 서로 안맞아서 그렇다. x64 용 GDB 에서 다음과 같이 하면 된다. 참고로 x64 상에서 GDB 도 디폴트로는 32bit 로 맞춰져 있기때문에 처음에 필히 show arch 로 현재 세팅된 아키텍쳐를 확인해보아야 한다.


Start gdb

Execute "set architecture i386:x86-64:intel"

Execute "add-symbol-file linux-3.0/vmlinux"

Execute "show arch" to verify its still "i386:x86-64:intel"

Execute "target remote localhost:1234"

Execute "continue"

Press Ctrl+C, I get the above message.


이렇게 하면 Ctrl-C 로 인터럽트도 잘 걸리고 브포도 잘 걸린다. 아직 이해가 잘 안되는것이, 0x8048054 와 같은 여러 프로세스가 중첩적으로 많이 쓰는 주소에는 브포가 안걸리지만 특정한 프로세스가 혼자 매핑해서 쓰는 유저스페이스 주소에는 CPL3 인 상태에서 브포가 가능하다.


참고로 아래는 x64 QEMU 상에 gdb 서버 돌리는 옵션이 추가된 스크립트 예시...

-s 옵션과 -gdb tcp::1234 는 같은 옵션이다.

#!/bin/bash

qemu-system-x86_64 \

    -m 64M \

    -nographic \

    -kernel bzImage \

    -append 'console=ttyS0 loglevel=3 oops=panic panic=1' \

    -monitor /dev/null \

    -initrd rootfs.img \

    -gdb tcp::1234


그런데 이런식으로 해서 gdb 에 붙어보니 레지스터, 메모리조사 및 브포는 잘 되긴하는데 si, ni 가 안된다 -_- Thread #1 이 종료되었다는 식으로 에러가 나오면서 무시된다. 


warning: Remote failure reply: E22

[Thread 1] #1 stopped.


무슨 이유인지는 몰라도 브포에 멈춘상태에서 continue 를 해도 같은 에러가 나는데... 하다보니 브포에서 멈춘뒤에 브포를 지우고 다른위치에 또 브포를걸고 continue 를 하면 잘된다... 뭐 결국에 si, ni 와 같은 동작을 할수있긴 한건데... 이거 왜이런거지 ㅠㅠ


ARM 의 경우 ARM GDB 가 없어도 gdb-multiarch 를 구해서 ARM 아키텍쳐로 세팅한뒤에 비슷하게 하면된다.

(우분투에서 apt-get 으로 설치가능)




'Programming' 카테고리의 다른 글

QEMU and timer interrupt  (0) 2014.12.02
Install z3 for python from source  (0) 2014.11.12
python distorm3 1분요약  (0) 2014.09.30
CVE-2014-3153 on x86 Ubuntu 13.04  (0) 2014.07.24
Mounting / Unmounting ASCII cpio archive in Linux  (6) 2014.06.25