2011-08-02 1 views
8

gdb 플래그없이 컴파일 된 실행 파일로 생성 된 코어 파일을 디버그 할 수 있습니까?gdb 플래그없이 컴파일 된 실행 파일로 생성 된 코어 파일을 디버그 할 수 있습니까?

그렇다면 포인터 또는 자습서가 있습니까?

+0

gdb 플래그로 무엇을 언급하고 있습니까? -g 플래그 (디버그 플래그)를 의미합니까 – Pradeep

+1

좋은 대답이 제시하는대로 어셈블리 레벨 디버깅은 모두 그렇게 할 수 있습니다. 할 수는 있지만 쉽지는 않으며 '튜토리얼'이 없습니다. 프로그램을 실행중인 프로세서의 어셈블리 언어를 배워야합니다. – Omnifarious

+0

운영체제, CPU 아키텍처 및 객체 파일 형식을 아는 것이 더 도움이 될 수 있습니다. 이 정보를 제공해 주시겠습니까? – Jens

답변

14

: 당신이에서 찾을 수 있습니다 gdb를 실행 corefile (핵심 파일)

더 :로

그렇지 않으면 당신은 그렇게 할 수 있습니다. 그것은 쉽지 않을 것입니다. 내가 너에게 모범을 보이겠다.

main() 
{ 
    *((char *) 0) = '\0'; 
} 

내가 그것을 컴파일하고 어떤 문자가 없는지 확인합니다 :

$ cc foo.c 
$ strip a.out 
$ file a.out 
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped 

좋아, 시간

나는 다음과 같은 프로그램이 foo.c를라는 것을 말할 수 있습니다 실행하려면 :

$ ./a.out 
Segmentation fault (core dumped) 

버그가있는 것 같습니다. 디버거를 시작해 보겠습니다.

$ gdb ./a.out core 
[..] 
Reading symbols from /tmp/a.out...(no debugging symbols found)...done. 
[..] 
Core was generated by `./a.out'. 
Program terminated with signal 11, Segmentation fault. 
#0 0x0804839c in ??() 
(gdb) bt 
#0 0x0804839c in ??() 
#1 0xb7724e37 in __libc_start_main() from /lib/i386-linux-gnu/libc.so.6 
#2 0x08048301 in ??() 

흠. 기호 없음. 무슨 일이 있었는지 알아낼 수 있을까요?

(gdb) x/i $eip 
=> 0x804839c: movb $0x0,(%eax) 

EAX 레지스터가 가리키는 메모리 위치에 0의 값을 가진 바이트를 저장하려고했습니다. 왜 실패 했나요?

(gdb) p $eax 
$1 = 0 
(gdb) 

EAX 레지스터가 메모리 주소 0을 가리키고 해당 주소에 바이트를 저장하려고했기 때문에 실패했습니다. 죄송합니다.

불행히도 나는 좋은 자습서에 대한 지침이 없습니다. "gdb 리버스 엔지니어링"을 검색하면 잠재적으로 유용한 비트와 조각이있는 링크가 제공됩니다.

업데이트 :

나는이 고객에 코어 덤프를 디버깅에 대한한다는 의견을 나타났습니다. 스트립 된 바이너리를 고객에게 배송 할 때는 항상 해당 바이너리의 디버그 버전을 유지해야합니다.

나는 스트립하지 말고 소스 코드를 제공하는 것을 권장합니다. 필자가 작성한 모든 코드는 소스 코드로 고객에게 전달됩니다. 나는 고객 측에서 너무 많은 시간 동안 소프트웨어의 결함이있는 조각을 출하했지만이를 고칠 방법을 모르는 무능한 공급 업체를 바라보고있었습니다. 그것은 빤다. 몇 가지 추가 정보가 있습니다

Debug core file with no symbols

:

이 실제로이 질문의 중복이 될 것으로 보인다.

-2

-g 플래그없이 프로그램을 컴파일하면 코어 파일을 디버그 할 수 없습니다. 예 당신이 할 수있는 http://wwwpub.zih.tu-dresden.de/~mlieber/practical_debugging/04_gdb.pdf

+1

그래서 대부분의 고객 시나리오에서 실행 파일은 gdbflag -g없이 컴파일되었을 것입니다. 그렇다면 고객 시나리오의 경우 생성 된 코어 덤프를 어떻게 디버그 할 수 있습니까? – Hemanth

+0

고객 시나리오에 따르면 릴리스 된 빌드 또는 EXE에 대해 이야기하고 있다고 생각합니다.이 경우 디버그가 내 경험에 따라 코어 덤프를 수행 할 수 없습니다. 더 나은 답변을 기다릴 수 있으므로 이익을 얻을 수 있습니다. – Pradeep

+0

내 경험에 의하면, 릴리즈 빌드는 여전히 -g (-O3과 같은 최적화가있는 경우에도)로 빌드됩니다. 이렇게하면 일부 * 디버깅 가능성이 보장됩니다. 실행 파일은 아카이브에 복사됩니다. 그런 다음 심볼이 실행 파일 (라이브러리 포함)에서 제거되고 아카이브됩니다. 마침내 심볼리스 버전이 출시되었습니다. 그런 다음 실행 파일의 코어 파일을 제거 된 심볼과 함께 사용하면서 실행 파일을 디버그 가능 실행 파일로 설정하도록 gdb에 지시 할 수 있습니다. 그런 다음 GDB가 행복하고 모든 것이 "잘 작동합니다"(최적화 된 실행 파일을 디버깅하는 것만큼이나 효과가 있습니다). – inetknght

2

예, 당신이 할 수있는, 이 무엇인지 균열이 불행하게도 내가 슬라이드와 나는 더 이상 대학에 따라 교육 과정의 문서가없는, 일을하지만, reverse engineering 또는 disassembly tutorials 당신에게 줄 것이다에 대한 인터넷 검색을하는 쓰기, 즉 사람들 몇 가지 출발점. 또한 어셈블리 코드에서 주위를 돌아 다니는 것이 중요합니다.

우리의 클래스는 책을 중심으로 제 1 장 & 3를 기반으로하지만 새로운 버전은 이제 컴퓨터 시스템 뒤의 기초를 설명하고 또한 당신에게의 작업의 좋은 지식을 제공

Computer Systems: A programmer's perspective by R.E. Bryant and D.R. O'Hallaron

거기가되었습니다 시스템의 프로그램.

64bit CPU가 32bit CPU보다 다른 어셈블리 코드를 가지고 있음을 알고있을 때도 마찬가지입니다.

관련 문제