2012-05-14 5 views
7

디버그 기호가없는 프로그램의 코어 덤프에 저장된 프레임에 액세스하고 싶습니다 (C에서이 작업을 수행하려고합니다). GDB에서 프로그램과 코어 덤프를 열면 함수 이름을 포함한 스택 추적을 얻습니다. 예를 들어 모든 기능의GDB없이 코어 덤프에서 프레임을 읽는 방법?

(gdb) bt 
#0 0x08048443 in layer3() 
#1 0x08048489 in layer2() 
#2 0x080484c9 in layer1() 
#3 0x0804854e in main() 

이름은 .strtab 섹션에서 실행 파일에 저장됩니다. 다른 프레임으로 스택 트레이스를 구축하려면 어떻게해야합니까? 배치 모드에서 GDB를 실행하면 이 아니라 옵션을 사용할 수 있습니다. 또한 코드가 독립적으로 작성되지 않기 때문에 "gdb에서 필요한 부분을 복사하는 것"도 나쁜 생각입니다.

제 질문을 더 정확하게 작성하려면 스택 정보를 읽을 수있는 코어 덤프 안의 지점을 어디에서 찾을 수 있습니까? 이러한 정보에 액세스하기위한 라이브러리가 있습니까? 내가 사용할 수있는 구조체? 또는 그 정보가 코어 덤프 내부에서 어떻게 구조화되어 있는지 문서화하는 것이 더 낫습니다.

은 (이미 질문 "how to generate a stack trace from a core dump file in C, without invoking an external tool such as gdb"을 볼 수 있지만, 유효한 응답이 없기 때문에, 내가 다시 물어 것이라고 생각)

[편집] 나는 리눅스 86에서이 일을 해요

+3

윈도우, 리눅스, 맥 OS를? x86, x86_64, PPC, Arm ....? – Flexo

+0

오, 이런, 미안, 잊어 버렸어! 리눅스, x86 – Uhlo

+0

http://www.kernel.org/doc/man-pages/online/pages/man5/core.5.html – Flexo

답변

7

코어 덤프는 스택 정보도 포함합니다. 이 스택 정보를 코어 덤프 파일의 EBP 및 EIP 레지스터 값과 함께 사용할 수있는 경우 스택 추적을 인쇄 할 수 있습니다. 나는 이것을하기위한 프로그램을 작성했다. 다음 링크에서 프로그램을 찾을 수 있습니다.

http://www.emntech.com/programs/corestrace.c 

사용법 : 실행하면 위의 프로그램을 컴파일하고 corefile을 제공하십시오. 당신은 또한 인쇄 할 문자를 원하는 경우에

 $corestrace core 

, 당신은 다음과 같이 수행의 핵심은 '시험'이다 생성 프로그램을 가정 해 봅시다.

 $ nm -n test > symbols 
     $ corestrace core symbols 

샘플 출력은 다음과 같습니다

 $ ./coretrace core symbols 

     0x80483cd foo+0x9 
     0x8048401 func+0x1f 
     0x8048430 main+0x2d 
+0

덕분에 많은 도움이되었습니다. – Uhlo

+0

링크가 더 이상 작동하지 않지만 http://emntech.blogspot.com/2012/08/printing-backtracestack-trace-using.html에서 사본을 찾았습니다. – mephi42

+0

요점이 추가되었습니다. https : //gist.github .com/root42/c979b037f85dc4b2be1f3735afedeb1d – Arne

관련 문제