본문 바로가기

[Debugging] Tips

(55)
[GDB] Arm(Armv7): C 코드와 어셈블리 코드를 동시에 디버깅하기 이번 포스트에서는 GDB를 사용해 디버깅을 하는 방법을 소개합니다. 소개된 내용을 참고하면 즐겁게 어셈블리 명령어를 디버깅할 수 있습니다. 환경: 라즈베리 파이4 GDB 실행 아래 명령어를 사용해 GDB를 Text User Interface 모드로 실행합니다. $ gdb -tui armv7_aapcs_proc 다음은 위 명령어로 실행한 화면입니다. 이제 바로 다음 명령어를 입력해 어셈블리 명령어 창을 보이도록 합시다. $ layout split 이번에는 'b main'와 'r' 명령어를 입력해 main() 함수에 브레이크 포인트를 걸고 프로그램을 실행합니다. 위 명령어를 입력하면 다음과 같은 화면이 보입니다. 위 화면과 같이 main() 함수의 첫 번째 라인에 브레이크 포인트가 걸립니다. C 코드 한 줄..
[리눅스커널] 디버깅: TRACE32: 모듈 타입 드라이버 심벌(*.ko)을 로딩해 깨진 콜 스택 복원 소개 실전 디버깅을 하다보면, 종종 모듈 타입 디바이스 드라이버에서 크래시가 발생할 때가 있습니다. 크래시가 발생하면 먼저 어떤 콜 스택인지 파악하는 경우가 많습니다. 문제는 이 때 TRACE32로 콜 스택 복원을 시도해도 제대로 콜 스택이 출력되지 않는다는 사실입니다. 그 이유는 무엇일까요? 바로 모듈 타입 드라이버의 심벌 정보가 없기 때문입니다. 이번 포스트에서는 TRACE32로 모듈 타입 디바이스 드라이버의 심벌을 로딩하는 방법을 소개합니다. TRACE32에서 드라이버 모듈 로딩하기 아래 스크린 샷은 Arm64 아키텍처의 함수 호출 규약에 따라 레지스터를 세팅 한 후 출력되는 콜 스택입니다. el1_dbg 라는 레이블이 보이니 BUG() 매크로 함수를 호출해 크래시가 발생한 듯합니다. 그런데 002..
[라즈베리파이] crash-utility 설치(Arm64) 소스 내려 받기 $ git clone https://github.com/crash-utility/crash.git 빌드 시작 $ make target=ARM64 빌드 도중 아래 에러 발생 checking for zlib.h... yes checking for library containing dlgetmodinfo... no checking for iconv... yes checking for iconv declaration... install-shextern size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); checking for library containing wadds..
[Crash-Utility] 램덤프를 로딩할 때 심볼을 읽는 함수: symbol_exists, readmem + if (symbol_exists("swapper_pg_dir")) { + int i_pg, len_pg, online_pg; + char *buf_pg; + ulong *maskptr_pg, addr_pg; + ulong input_addr = 0xffffffc010f91000; + + error(INFO, "--[-][%s][%d] === swapper_pg_dir === at %s\n", __func__, __LINE__, __FILE__); + + if (readmem(input_addr, KVADDR, buf_pg, len_pg, + "swapper_pg_dir", RETURN_ON_ERROR)) { + error(INFO, "read [+][%s][%d] === swapper_pg_dir =..
[Crash-Utility] 램덤프 로딩 시 파라미터(CONFIG_PROC_KCORE) 크래시 유틸리티를 실행해 램덤프를 로딩하려면 적절한 아규먼트를 지정해야 합니다. 예를 들면 다음과 같습니다. ./crash64 ramdump.bin@0x800000000 -p 4096 -m kimage_voffset=0xFFFFFFBF58000000 -m page_offset=0xFFFFFF8000000000 -m vabits_actual=39 -m phys_base=0x40000000 --no_panic --smp vmlinux kimage_voffset, page_offset, phys_base과 같은 파라미터를 제대로 설정해야 크래시 유틸리티가 실행됩니다. 그런데 kimage_voffset, page_offset 옵션을 어떻게 적용해면 될지 모를 때가 있습니다. 이럴 때는 이번 포스트에서 소개한 방..
[TRACE32] T32: vmcore 파일을 TRACE32 시뮬레이터로 올리기 램덤프 대신에 vmcore 파일을 올리려면 다음과 같은 커맨드를 입력하면 된다. $ d.load.e vmlinux 0xdeadbee0 $ d.load.e vmcore /nocode /nosymbol /physload 1. vmlinux 로딩 방법 KASLR 컨피그로 빌드된 경우 아래와 같이 로딩하면 된다. $ d.load.e vmlinux 0xdeadbee0 만약 KASLR 컨피그 없이 빌드한 경우 아래 명령어를 실행하면 된다. $ d.load.e vmlinux 2. vmcore 로딩 방법 vmcore를 실행할 때 반드시 옵션을 잘 적용해야 한다. $ d.load.e vmcore /nocode /nosymbol /physload or $ d.load.e vmcore /nc /ny /physload /no..
TRACE32] cmm script to traverse task_struct of all processor for BSP engineers >>>> What is debugging To gain an insight into what happens in the kernel, we have to read and understand source code. But we should take a close look at the system while it is running in order to find out what is going on inside kernel or kernel devier. >>> This activity is called debugging. When fixing the problem during project, I can say that I am "debugging" the system. >>> Debugging is con..