2016-10-21 3 views
1

私はteststring.cppファイルを持って、私はGDBは出力のstd ::文字列値ことができるかどうかを確認したい:G ++ teststring.cpp -gを使用してグローバル変数のときはstd :: stringをgdbに出力できません。なぜですか?

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

、およびGDBが

(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

これは奇妙です。私はこのようなメインの最初の行であると

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」という名前のシンボルがありますときとします

がsHelloは右、ELFファイルのシンボルテーブルに表示されますか?

答えて

1

もっと奇妙な私が使用している|それらのどちらも私にどんな結果が得られ、a.outの両方のバージョンを確認するには、 "$ readelfが-sのa.outはgrep 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の上位バージョンにあなたが予想される動作を取得します。

関連する問題