본문 바로가기

[Debugging] Tips

(55)
[리눅스][디버깅] GDB로 깨진 콜 스택 복원하기(공유 라이브러리 로딩하는 방법) 리눅스 프로젝트를 개발하면 코어덤프(coredump)를 열어서 크래시가 발생한 원인을 분석할 때가 많습니다. 많은 개발자 분들이 코어덤프를 열어서 크래시가 발생한 원인을 분석하죠. 코어덤프를 열어 gdb를 사용해 디버깅할 때 가장 짜증나는 것 중 하나는 공유 라이브러리를 제대로 로딩하지 못해 콜 스택이 보이지 않을 때 입니다. 이번에는 코어덤프를 로딩할 때 필요한 정보 중 하나인 공유 라이브러리의 정보(패스/이름)을 확인하는 방법을 소개합니다. 깨진 콜 스택 확인하기 먼저 콜 스택을 보겠습니다. (gdb) bt #0 0x0000007f7def1808 in __glibc_raise (sig=sig@entry=6) at /usr/glibc/raise.c:1354 #1 0x0000007f7def2d80 in ..
[리눅스] GDB 프로그램 사용 위치 파악: 'which -a' gdb와 같은 프로그램이 설치된 경로를 확인하고 싶을 때가 있습니다. 이 때 다음 명령어를 사용하면 됩니다. 'which -a' 아래는 터미널에서 'which -a' 명령어를 사용한 예시입니다. baldcandy:#/etc$ which -a gdb-multiarch /usr/bin/gdb-multiarch gdb-multiarch가 '/usr/bin/gdb-multiarch' 에 위치해 있군요. 이번에는 gdb 프로그램의 위치를 확인해보겠습니다. baldcandy:#/etc$ which -a gdb /usr/bin/gdb gdb가 '/usr/bin/gdb' 에 위치해 있군요. --- "이 포스팅이 유익하다고 생각되시면 공감 혹은 댓글로 응원해주시면 감사하겠습니다. "혹시 궁금한 점이 있으면 댓글로 질문 ..
[리눅스커널] 부팅 과정 유익한 패치 아래 패치도 정말 유용하다. * 유저 프로세스가 ASSET될 때 콜 스택 출력 * 부팅 과정에 오픈하는 파일을 출력 * 실행되는 파일 이름 출력 diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 9f5d818..4d6df0c 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c @@ -37,7 +37,8 @@ #include #include #include - +#include +#include static const char *handler[]= { "prefetch abort", @@ -60,6 +61,48 @@ static int __init user_debug..
유용한 TRACE32(T32) 명령어 1. linked list를 표현하고자 할 경우 아래와 같은 명령어를 입력하면 dcc_tcb의 linked list를 표현한다. v.chain %l %m %all dcc_tcb dcc_tcb.link.next_ptr 2. 특정 변수의 데이터를 dump하고 싶은 경우 var.dump %BIN err_f3_trace_buffer /orient 3. 소스 코드의 패스를 지정 y.spath.srd "Y:\f3_main_src\non_HLOS\modem_proc" 4. 소스 코드에서 스트링을 검색 data.grep "err_init" err.c 4.1 모든 소스에서 아래 스트링을 검색 data.grep "err_f3_trace_buffer" 5. 현재 심볼의 상태(소스 수, 라인 수)를 표현 -------- go..
[리눅스커널] 리눅스 커널 브링업 패치 [1] (4.14v) diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index f702f2b..299427d 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c @@ -435,6 +435,45 @@ int call_undef_hook(struct pt_regs *regs, unsigned int instr) return fn ? fn(regs, instr) : 1; } +void trace_exe_filename(void) +{ + struct file *exe_file; + char *pathbuf, *fname; + + printk("[+][trace][%s][%s,%d] caller: %..
[리눅스커널] 디바이스 트리: of_root 디버깅 디바이스 트리를 관리하는 주요 자료 구조는 다음과 같습니다. * of_root * of_aliases * of_chosen * of_stdout of_root of_root 전역 변수는 다음과 같습니다. of_root = 0xF6B49F44 -> ( name = 0xF6B4A16C -> "", type = 0xC157AEAB -> "", phandle = 0, full_name = 0xF6B49F94 -> "/", properties = 0xF6B49F98, deadprops = 0x0, parent = 0x0, child = 0xF6B4A170 -> ( name = 0xF6B4A264 -> "cpus", type = 0xC157AEAB -> "", phandle = 0, full_name = 0xF6B..
[TRACE32] 메모리 덤프에서 검색(서치)하는 명령어: data.find TRACE32를 사용하다 보면 메모리 덤프에서 특정 데이터를 검색하고 싶은 경우가 있습니다. 이 때는 data.find 명령어를 사용하면 됩니다. 다음은 TRACE32에서 릴리즈한 data.find 관련 스팩 문서(general_ref_d.pdf)의 내용입니다. Format: Data.Find [ [%] | [/]] : Byte | Word | Long | Quad | TByte | HByte | Float . | BE | LE : Back | NoFind ; search for byte 0x3f in the specified address range Data.Find 0x100--0xfff 0x3f ; search the next byte x3f Data.Find ; search for specifie..
[TRACE32] struct devce 정보 덤프: dpm_device_list_dump.cmm 아래 cmm 을 실행하면 디바이스에 존재하는 struct device 인스턴스 정보를 모두 볼 수 있습니다. ;**************************************************************************** ;** dpm_device_list_dump.cmm ;** ;** This cmm file is designed to dump all dpm_list. ;** ;** ;**************************************************************************** ;** ;** EDIT HISTORY FOR MODULE ;** ;** ;** when who what, where, why ;** -------- --- -..