2016-10-21 9 views
1

, 나는 경우 gdb를 출력 할 수있는 표준 : : 문자열 값을보고 싶은 : g ++ teststring.cpp -g 사용std :: string은 전역 변수 일 때 gdb에서 인쇄 할 수 없습니다. 이유가 무엇입니까? 나는 teststring.cpp 파일을 가지고

#include<string> 
#include<iostream> 
using namespace std; 
string sHello="hello world"; 
int main() 
{ 
    cout<<sHello.c_str()<<endl; 
    return 0; 
} 

을하고

(gdb) b main 
Breakpoint 1 at 0x400bfa: file teststring.cpp, line 7. 
(gdb) r 
Starting program: /home/x/a.out 

Breakpoint 1, main() at teststring.cpp:7 
7  cout<<sHello.c_str()<<endl; 
(gdb) p sHello 
No symbol "sHello" in current context. 
a.out의 GDB

이상합니다. 내가

string sHello="hello world"; 

를 이동하면 같은 주요의 첫 번째 줄, 일하기 :

#include<string> 
#include<iostream> 
using namespace std; 
int main() 
{ 
    string sHello="hello world"; 
    cout<<sHello.c_str()<<endl; 
    return 0; 
} 

내가 그것을 디버깅하는 경우 "P sHello는"작동합니다. 글쎄, 너무 이상해.

왜 기호가 없습니까?

이상한 점은, "$ readelf -s a.out | grep sHello"를 사용하여 두 버전의 a.out을 모두 확인하지 않았기 때문에 어떤 결과도 나에게주지 않습니다.

sHello는 ELF 파일의 심볼 테이블에 나타납니다 오른쪽 :

나는 "sHello"라는 기호가있을 때 가정?

답변

1

더 이상 내가 사용입니다 | a.out의 두 버전을 확인하기 위해 "$ readelf -s a.out의 그렙 sHello"를, 그들도 나에게 어떤 결과를 제공합니다.

당신은 시도해야합니다 : 어떤이있는 경우에는

$ readelf -w a.out | fgrep sHello 

<2fd3> DW_AT_name  : (indirect string, offset: 0xce6): sHello 

-w 스위치는 파일에 디버그 섹션의 내용을 표시합니다.

왜 기호가 없습니까?

컴파일러와 디버거 사이의 불일치 일 수 있습니다.

내가 (g ++ v5.4.0 및 GDB 7.11.1로) 문제를 재현 할 수 없습니다

(gdb) p sHello 
$3 = {static npos = <optimized out>, 
     _M_dataplus = {<std::allocator<char>> = 
     {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, 
     <No data fields>}, 
     _M_p = 0x614c38 "hello world"}} 

어쩌면 GDB의 상위 버전에 당신이 예상되는 동작을 얻을 것이다.