Programing

GDB가 어떤 주소에 문제가 발생했는지 알려주려면 어떻게 해야 할까?

c10106 2022. 4. 29. 20:47
반응형

GDB가 어떤 주소에 문제가 발생했는지 알려주려면 어떻게 해야 할까?

내 프로그램이 NULL 포인터 또는 오래된 메모리에 액세스하는지 알고 싶다.

역추적은 다음과 같다.

프로그램 수신 신호 SIGSEGV, Segmentation fault.
[스레드 0x2b0fa4c8로 전환(LWP 1333)]/lib/libpthread.so.0의 pthread_bulx_lock()에 0xxa6ad4가 있음
(gdb) bt#0 /lib/libpthread.so.0의 pthread_virx_lock()에서 0x4a6ad4
1위 0x0058e900인치?()

GDB 7 이상에서는 다음 항목을 검사할 수 있다.$_siginfo신호가 발생할 때 작성되고 고장 주소를 결정하는 구조:

(gdb) p $_siginfo._sifields._sigfault.si_addr

표시되면(void *) 0x0그러면 NULL 포인터 참조가 취소된다.

GDB에서 프로그램을 실행하십시오.Seggfault가 발생하면 GDB는 변수 및 관련 주소와 함께 프로그램의 라인 및 문구를 알려준다.

GDB의 "인쇄"(p) 명령을 사용하여 변수를 검사할 수 있다.라이브러리 호출에서 충돌이 발생한 경우 "프레임" 명령어 시리즈를 사용하여 해당 스택 프레임을 볼 수 있다.

참조URL: https://stackoverflow.com/questions/3003339/how-can-i-get-gdb-to-tell-me-what-address-caused-a-segfault

반응형