IT Share you

Android 커널 디버깅

shareyou 2020. 12. 5. 10:57
반응형

Android 커널 디버깅


저는 kgdbNexus One을 사용하기 위해 실험 해 왔습니다 .

나는에서 커널 당긴 https://android.googlesource.com을 하고 함께 할 수있는 모든 것을 사용할 수 kgdb를 포함하여 kgdbts테스트를 사용하여 menuconfig. 커널을 성공적으로 빌드하고 장치에 플래시했습니다 (루팅되어 CyanogenMod 7을 실행 중임).

나는 또한에있는 지침을 따랐다 http://bootloader.wikidot.com/android:kgdb 에서 요구하는 직렬 연결 역할을하는 USB 연결을 사용하려면 kgdb(에서 통신 및 테스트 ttyACM0ttyGS0성공적를).

다음 폴더는 것을 나타내는 존재 kgdboc하고 kgdbts커널에 내장되었습니다

/sys/modules/kgdboc/parameters
/sys/modules/kgdbts/parameters

다음은 dmesg의 출력으로 kgdbts테스트가 성공적으로 완료되었는지 보여줍니다.

# dmesg | grep kgdb
<6>[   12.974060] kgdb: Registered I/O driver kgdbts.
<6>[   12.981781] kgdbts:RUN plant and detach test
<6>[   12.995178] kgdbts:RUN sw breakpoint test
<6>[   13.002441] kgdbts:RUN bad memory access test
<6>[   13.010864] kgdbts:RUN singlestep test 1000 iterations
<6>[   13.019042] kgdbts:RUN singlestep [0/1000]
<6>[   13.077850] kgdbts:RUN singlestep [100/1000]
<6>[   13.132720] kgdbts:RUN singlestep [200/1000]
<6>[   13.187500] kgdbts:RUN singlestep [300/1000]
<6>[   13.242370] kgdbts:RUN singlestep [400/1000]
<6>[   13.297149] kgdbts:RUN singlestep [500/1000]
<6>[   13.351928] kgdbts:RUN singlestep [600/1000]
<6>[   13.406829] kgdbts:RUN singlestep [700/1000]
<6>[   13.461578] kgdbts:RUN singlestep [800/1000]
<6>[   13.516540] kgdbts:RUN singlestep [900/1000]
<6>[   13.570922] kgdbts:RUN do_fork for 100 breakpoints
<6>[   21.117645] kgdb: Unregistered I/O driver kgdbts, debugger disabled.

내가 겪고있는 문제는 커널이 트리거되는 것이라고 생각합니다 kgdb.

# echo -n g > /proc/sysrq-trigger

그냥 명령 프롬프트로 돌아가서 (내 생각에) 모든 것을 동결하고 전화에 실제 포트가 없기 때문에 가짜 직렬 포트로 사용되는 USB를 통해 프롬프트를 보내는 것으로 가정합니다.

내 연구에서 수집 한 내용에서 프롬프트는 내가 발행 할 수있는 계기가되어야한다는 것입니다.

(gdb) target remote /dev/ttyACM0

그리고 커널을 사용하여 디버깅 세션에 연결합니다.

또한 테스트 한 /proc/sysrq-triggerbc나는 몇 가지 명령을 전달할 수 있어요 것을 단지 확인 sysrq.

그래서 가능한 한 많은 정보를 제공하려는 나의 오랜 시도에 따른 내 질문은 왜 g디버거를 트리거하지 않습니까?

이것은 모든 시스템에서 커널 디버깅에 대한 첫 번째 시도이며 Google에서 내 검색 문구를 구할 방법이 없어서 당신에게 의지합니다. 감사!

(나는 또한 이것이 아직 안드로이드 커널에서 지원되지 않는다고 생각하기 때문에 성공하지 않고 커널 명령 줄에 kdgbwait를 넣는 것을 시도했습니다)


Android 커널 질문은 [SO]에서 거의 발생하지 않습니다. 다른 사람이 대답하지 않았기 때문에이 문제에 대한 내 결과를 제공했습니다. 불행히도 나는 이것을 테스트 할 넥서스가 없으므로이 답변은 문제의 단계별 해결 방법이 아니지만 올바른 방향으로 안내해야합니다.

이 문제에 대해 내가 찾은 유일한 유용한 리소스는 Dongdong DengLKML 패치 이므로 일반적으로 풍부하고 잘 공개되어 있으므로 구성 문제가 아닐 것입니다.

이것은 커널 빌드에 문제가 있음을 나타냅니다. 최신 버전의 CM으로 다시 시작하여 문제가 해결되는지 확인하고 싶습니다.

실패하면 시아 노겐 팀에보고하고 이것이 알려진 문제인지 간단한 해결 방법이 있는지 확인하십시오.

마지막 수단으로 버전이 호환되는 경우 패치를 시도 할 수 있습니다. 유일한 대안은 소매를 감고 CM 커널을 해킹하여 패치를 통합하는 것입니다.

행운을 빕니다.


Android 하드웨어에 대한 경험은 없지만 VirtualBox 클라이언트로 실행되는 kgdb 컴파일 커널을 수행했으며 호스트에서 가상 직렬 포트를 통해 게스트에 연결하고 gdb (표준 "대상 원격"명령 사용)를 사용하여 단계를 수행 할 수 있습니다. kgdbwait의 도움으로 가상 게스트 커널의 전체 부팅을 통해. 이것 없이는 0xcc 인 "int 13"이라는 인라인 어셈블리를 구현하는 것 외에는 아무것도하지 않는 커널 모듈을 작성할 수 있습니다. 로드되면 직렬 연결의 호스트 측에 중단 점이 나타나고 중단 점을 설정하고 커널을 계속 실행할 수 있습니다. 이것은 kgdb가 "int 13"예외를 처리하기 때문에 작동합니다. u가 "* p = 0"과 같은 다른 종류의 예외를 명시 적으로 생성하고 p가 NULL을 가리키는 경우 u는 여전히 중단 점을 얻습니다.


관련 게시물 에서이 게시물을 찾았 으며 관심이있는 사람이 있으면 Nexus 6에서이 작업을 수행하기 위해 내가 한 몇 가지 작업을 방금 게시했다고 말하고 싶습니다.

http://www.contextis.com/resources/blog/kgdb-android-debugging-kernel-boss/

흥미롭게도 sysrq에 대한 OP의 문제는 나도 만난 것입니다. 이 동작의 이유는 KGDB가 올바르게 초기화되지 않아 'g'(kgdb) 트리거에 대한 처리기를 설치하지 못하기 때문입니다. 이것이 다른 모든 sysrq 명령이 여전히 작동하는 이유입니다.

더 긴 설명 (@Robert에게 감사) :

이 작업을 수행하려면 이 Accuvant 블로그를 기반으로 UART 디버그 케이블을 만들어야했습니다.. This is quite a simple circuit which consists of a FTDI 3.3v basic breakout (available from SparkFun at the time of writing), as well as 4 resistors (2 x 1K Ohm, 1 x 1.2K Ohm and 1 x 100Ohm), and a 4-element Tip-Ring-Ring-Sleeve (TRRS) headphone jack. The resistors are essentially providing a voltage divider to reduce the 3.3v down to something a little safer for your phone. By inserting the audio jack with the other end connected to your circuit board, the audio subsystem recognises that a voltage (~2.8V) on the one of the pins and it knows to provide a UART interface via that cable. The FTDI breakout plugs into your PC via USB and from here you can access console messages via a terminal emulator like minicom. However, you now have a serial interface through the same mechanism and that's what we can use for a KGDB connection.

So at this point some relatively minor changes are required to the Nexus 6's serial driver (msm_serial_hs_lite.c) to support KGDB (specifically, the ability to perform atomic character I/O operations). I just ported these changes from the Linux Kernel mainline code as a chap called Stephen Boyd had done the hard work to the full MSM (Qualcomm) serial driver msm_serial.c. His changes can be found here or just search for "msm_serial: add support for poll_" on Google. The port wasn't difficult and my code can be found on github.

Aside from that you need to be able to build a custom kernel for your N6 which google provides lots of information on. You then need to create a boot image which contains the KGDB modifications in the github repo. I took the stock kernel from https://developers.google.com/android/nexus/images, extracted it (using abootimg -x) and then used the following command to repack it with my custom kernel (zImage-dtb) and additional command line params to ensure KGDB would be loaded and point to my serial port like so:

abootimg -u boot.img -k zImage-dtb -c 'cmdline=console=ttyHSL0,115200,n8 kgdboc=ttyHSL0,115200 kgdbretry=4'

With my boot.img created I could boot into it using the command fastboot boot boot.img, open an adb shell and then trigger a breakpoint in the Android kernel using the command:

echo -n g > /proc/sysrq-trigger

It is worth mentioning for completeness that you need superuser privileges to access /proc/sysrq-trigger so you need to have root.

With the phone halted, and your debug cable connected, launch a version of GDB for ARM on your host PC with your uncompressed kernel as an argument (e.g. arm-eabi-gdb ./vmlinux). Note: I'm running Ubuntu 14.04 and using arm-eabi-gdb from the 'prebuilts' directory in my AOSP source repository. Finally, enter the following commands:

set remoteflow off
set remotebaud 115200
target remote /dev/ttyUSB0

All being well this should immediately break into the kgdb breakpoint (that your write to /proc/sysrq-trigger produced) and you can start debugging.

참고URL : https://stackoverflow.com/questions/6697754/android-kernel-debugging

반응형