2016-06-04 5 views
0

cygwin (및 Linux)에서 초보자입니다.cygwin에서 "* .stackdump"파일을 사용하여 디버깅하는 방법

C 언어를 기반으로 실행 파일을 실행하려고하면 세그멘테이션 오류가 발생하고 stackdump 파일을 가져옵니다. 하지만 디버깅에 어떻게 사용하는지 모르겠습니다.

나는 stackdump 파일을 사용하여 디버깅하는 방법을 찾고 있었지만 찾지 못했습니다. 작은 팁이 나에게 매우 유용합니다. 내 가난한 영어를 읽어 주셔서 감사합니다 (영어는 제 1 언어가 아닙니다).

답변

1

첫 번째 : gcc에 플래그를 전달하여 프로그램을 컴파일해야합니다. -ggdb 그렇지 않으면 stackdump 정보가 쓸모가 없습니다. -O0 플래그도 전달하여 코드가 최적화되지 않으므로 gdb로 디버깅하는 것이 더 쉽습니다. 둘째

:

$ cat t-invmod.exe.stackdump 
Stack trace: 
Frame  Function Args 
0028C878 61032BCB (000000F4, 0000EA60, 000000A4, 0028C8D8) 
0028C998 610E7A7A (00000001, 0028CA3F, 00000001, 611A2C80) 

주소는 프로그램 또는로드 공유 libs와에서 오는 할 수 있습니다 다음 STACKDUMP 스택에 존재하는 주소를 제공, 32 비트에서이 예에서는 우리는 두 개의 주소가 있습니다.

주소를 코드 위치로 변환하려면 addr2line을 사용하십시오. 예 :이 경우

$ addr2line.exe -a 610E7A7A -a 61032BCB -e /usr/bin/cygwin1.dll 
0x610e7a7a 
/usr/src/debug/cygwin-2.5.1-1/winsup/cygwin/cygerrno.h:36 
0x61032bcb 
/usr/src/debug/cygwin-2.5.1-1/winsup/cygwin/cygerrno.h:35 

높은 주소는 충돌이 공유 lib에 아닌 프로그램에 있었던 나에게 말했다. 주소가 속한 당신을 식별 할 수 ldd를 사용할 수 있습니다 주소가 DLL의보다 낮은

$ ldd t-invmod.exe 
     ntdll.dll => /cygdrive/c/Windows/SysWOW64/ntdll.dll (0x776d0000) 
     kernel32.dll => /cygdrive/c/Windows/syswow64/kernel32.dll (0x75500000) 
     KERNELBASE.dll => /cygdrive/c/Windows/syswow64/KERNELBASE.dll (0x75a10000) 
     SYSFER.DLL => /cygdrive/c/Windows/SysWOW64/SYSFER.DLL (0x73480000) 
     cygflint.dll => /usr/bin/cygflint.dll (0x5f390000) 
     cygwin1.dll => /usr/bin/cygwin1.dll (0x61000000) 
     cyggmp-10.dll => /usr/bin/cyggmp-10.dll (0x589e0000) 
     cygmpfr-4.dll => /usr/bin/cygmpfr-4.dll (0x51080000) 
     cyggcc_s-1.dll => /usr/bin/cyggcc_s-1.dll (0x5ece0000) 
     cygntl-9.dll => /usr/bin/cygntl-9.dll (0x50270000) 
     cygstdc++-6.dll => /usr/bin/cygstdc++-6.dll (0x4b340000) 

경우,이 프로그램에 속한; 공유 라이브러리에 속한 경우 위치 정보를 복구하기위한 상대 * debuginfo 패키지를 설치해야합니다.