2012-06-15 6 views
0
내가 프로그램을 코딩하고 실행하는 동안 어느 시점에서이 충돌이 스택 추적을 인쇄하고 있습니다

:리눅스 스택 추적 덤프

pure virtual method called 
terminate called without an active exception 
0 prog   0x08f04a98 
1 prog   0x08f05147 
2     0xb7802400 __kernel_sigreturn + 0 
3 libc.so.6  0xb758fbb2 abort + 386 
4 libstdc++.so.6 0xb778653f __gnu_cxx::__verbose_terminate_handler() + 335 
5 libstdc++.so.6 0xb7784405 
6 libstdc++.so.6 0xb7784442 
7 libstdc++.so.6 0xb77850f5 
8 prog   0x08f2cb1f proj::raw_ostream::write(char const*, unsigned int) + 159 
9 prog   0x081df8fe 
10 prog   0x081d079b 
11 prog   0x08e8ac02 proj::Value::~Value() + 130 
12 prog   0x082749ad 
13 prog   0x08e1cd62 proj::Tiny::~Tiny() + 178 
14 prog   0x08e1fc86 proj::Alloca::~Alloca() + 38 
15 prog   0x08e252ac proj::Alloca::~Alloca() + 44 
16 prog   0x088e9bbc 
17 prog   0x088e9b64 
18 prog   0x08d3782e 
19 prog   0x08d36a46 
20 prog   0x08d34e95 proj::Medium::~Medium() + 485 
21 prog   0x08d34c9c proj::Medium::~Medium() + 44 
22 prog   0x08d3753c 
23 prog   0x08d36da4 
24 prog   0x08d350ed proj::Medium::eraseFromParent() + 109 
25 prog   0x08dc780d proj::Big::dropAllReferences() + 253 
26 prog   0x08e530b9 proj::Module::dropAllReferences() + 137 
27 prog   0x08e52ea0 proj::Module::~Module() + 64 
28 prog   0x08c602cb proj::Engine::~Engine() + 155 
29 prog   0x08743e00 proj::Controller::~Controller() + 192 
30 prog   0x08743d2c proj::Controller::~Controller() + 44 
31 prog   0x081cdee9 
32 libc.so.6  0xb75912df 
33 libc.so.6  0xb759134f 
34 libc.so.6  0xb7578cae __libc_start_main + 238 
35 prog   0x081cc501 

세 번째 열에 주소가 무엇입니까? 나는 그들이 기능 주소라고 생각하지만 그들은 무엇입니까? 일부 가상 함수가 somepoint에서 호출되는 것, 어떻게 가상 함수가 호출되는지 알 수 있습니까?

+0

원인 proj::raw_ostream::write(char const*, unsigned int)를 호출하는 가상 함수는 proj::Value::~Value()에서 호출

목록의 맨 아래, 근처 ++), 스택 추적에서보다 정확한 정보를 얻을 수 있습니다. –

답변

1

세 번째 열은 스택에 기록 된 프로그램 카운터이므로 코드 주소가됩니다.

소멸자 내에서 순수 가상을 호출하는지 여부를 확인해야합니다. 가장 가능성이 높은 proj::Value::~Value()proj::Value에서 순수한 가상을 호출합니다.

1

예, 기능 주소입니다. 해당 덤프에 해당하는 코어 파일이 있고 디버깅 기호로 컴파일 한 경우 gdb에 코어 및 실행 파일을로드하고 list *<address> 명령을 사용할 수 있습니다. 해당 주소에 해당하는 코드 줄이 표시됩니다.

코드를 보지 않고 writeraw_ostream은 가상 메소드입니다.

0

세 번째 열은 함수 스택에서 실행되는 실제 메모리 주소입니다 (네 번째 열과 같아야합니다.이 열은 명명 된 함수의 시작 부분에서부터 오프셋을 제공합니다).

함수 스택이 커지면서 나타납니다. 이전에 표시된 줄은 호출 스택에서 더 깊게 중첩되었습니다. 다른 방법 : 당신의 main는 디버그 정보 (`g의 -g` 플래그와 함께 프로그램을 컴파일을 제외하고