2016-09-30 2 views
0

나는 아래, ubuntu16.04에서, GDB의 캐치 옵션의 작은 실험을했다 :gdb를 사용하여 'catch'및 'syscall'을 추적하지 못했습니다. 'brk'을 찾지 못했다고보고합니까?

$ cat e.cpp 
#include<stdlib.h> 
#include<exception> 
int main() 
{ 
    try{ 
    throw 1; 
    }catch(std::exception e) 
    { 
    } 
    exit(0); 
} 

$ gcc가 e.cpp -g -lstdC++ $ gdb를

... 
Reading symbols from a.out...done. 
(gdb) catch throw 
Catchpoint 1 (throw) 
(gdb) catch syscall 
Catchpoint 2 (any syscall) 
(gdb) r 
Starting program: /home/a/cpp/a.out 

Catchpoint 2 (call to syscall brk), 0x00007ffff7df12e9 in __brk ([email protected]=0x0) at ../sysdeps/unix/sysv/linux/x86_64/brk.c:31 
31 ../sysdeps/unix/sysv/linux/x86_64/brk.c: No such file or directory. 

의 a.out 무엇 이 오류가 나타 납니까? 'r'명령을 다시 사용하면 프로그램이 종료됩니다.

(gdb) r 
The program being debugged has been started already. 
Start it from the beginning? (y or n) 

너무 이상합니다. 어떻게 그리고 왜이 brk 오류가 발생합니까?

답변

2

당신은 당신이 모든 콜에 설정 인수없이 GDB에서 콜 catchpoint을 설정하면, Setting Catchpoints에서 볼 : 인수를 지정하지

경우에 호출 호출이 잡힐 모든 시스템에서 돌아갑니다.

이 당신이 그것을 완료 한 후에 GDB이 알려주는 것입니다 :

(gdb) catch syscall 
Catchpoint 2 (any syscall) 

그런 다음 즉시 프로그램을 실행하고 brk 콜을 붙 잡았다. brk syscall이 동적 메모리 할당 구현 (실제로는 malloc 구현의 경우)에 사용되며 물론 프로그램에서 일부 메모리 할당을 수행하기 때문에 이는 놀랄 일이 아닙니다.

syscall이 발견되면 gdb는 brk.c에 줄 번호 31을 인쇄하려고했으나 실패했을 가능성이 큽니다. 왜냐하면 대부분의 libc 소스가 OS에 설치되어 있지 않기 때문입니다. libc 코드를 디버깅하지 않고 단순히 잡아내는 syscall을 실험하기 때문에이 오류를 무시해야합니다.

아마도 당신이 원하는 것은 bt을보고 코드에서 메모리를 어디에 할당하고 있는지 확인하는 것입니다.

관련 문제