2016-09-07 15 views
1

gdbでリモートデバッグすることを拒否する比較的シンプルなアプリケーション(他の単純なライブラリにリンクされている)があります。 gdbとgdbserverのバージョンが一致していることを確認しました。それは実際には両方のマシン上の同じOS(ubuntu)です。これは、実行可能ファイルからうまくシンボルをロードしているようです。だから私は間違っている可能性があるために少し損失があります。任意の提案が高く評価されました。ここにgdbからの転写物があります:リモートgdbのスタックトレースにシンボル(疑問符のみ)がありません

dev:/fast/git/archive/foo$ gdb /fast/git/foo 
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1 
Copyright (C) 2016 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-linux-gnu". 
Type "show configuration" for configuration details. 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>. 
Find the GDB manual and other documentation resources online at: 
<http://www.gnu.org/software/gdb/documentation/>. 
For help, type "help". 
Type "apropos word" to search for commands related to "word"... 
Reading symbols from /fast/git/foo...done. 
(gdb) target remote test1:5000 
Remote debugging using test1:5000 
Reading /lib64/ld-linux-x86-64.so.2 from remote target... 
warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead. 
Reading /lib64/ld-linux-x86-64.so.2 from remote target... 
Reading symbols from target:/lib64/ld-linux-x86-64.so.2...Reading /lib64/ld-2.23.so from remote target... 
Reading /lib64/.debug/ld-2.23.so from remote target... 
(no debugging symbols found)...done. 
0x00007ffff7dd7cc0 in ??() from target:/lib64/ld-linux-x86-64.so.2 
(gdb) bt 
#0 0x00007ffff7dd7cc0 in ??() from target:/lib64/ld-linux-x86-64.so.2 
#1 0x0000000000000003 in ??() 
#2 0x00007fffffffce02 in ??() 
#3 0x00007fffffffce2f in ??() 
#4 0x00007fffffffce32 in ??() 
#5 0x0000000000000000 in ??() 

ああ、面白いです。私はまだそれがなぜ分かりませんが、接続時には(偽のスタックトレース)しか表示しません。私が「続行」すると、休憩をトリガーすると、うれしく右のシンボルが印刷されます。

奇数...これは部分的にユーザーエラーですが、接続したときに実行を開始してメインの開始を中断すると予想されました。

+0

このプログラムをどのようにコンパイルしましたか?どのようなコマンドですか? –

+0

gcc -std = c99 -D_GNU_SOURCE -O0 -g3 -Wall -c -fmessage-length = 0 -ggdb -fPIC -MMD -MP -MF「foo.d」-MT「foo.o」-o「foo.o」 "" ../foo.c " リンカ:gcc -L ../../ library/Debug -o" bitbucket "./bitbucket.o -lentangle -lrt – rivenmyst137

答えて

0

いくつかのアイデア:

は、リモート・プログラムと共有ライブラリをデバッグシンボルを追加するには、-gでコンパイルされていることを確認します。 (no debugging symbols found)メッセージは、デバッグシンボルが実行可能ファイル全体に存在しないことを意味する場合があります。

ローカルとリモートプログラムが同じイメージであることを確認してください。あなたはそれぞれに「合計」をすることができます。 #1 0x0000000000000003 in ??()が壊れているように見えるため、これが問題になる可能性があります。

リモートボックスでターゲットを手動でデバッグできますか?そうであれば、シンボルがリモート/ローカルデバッグセッションに関するものかどうかを確認してください。 list <function>

アドレス範囲は、ローカルシステムとリモートシステムで同じにマッピングされることがよくあります。ローカルのデバッグセッションでアドレスを逆アセンブルし、マップする関数/メソッドを確認することができます。これは、リモートプログラムがクラッシュしている場合に役立ちます。少なくとも、どこに問題があるかを知ることができます。

1

は私が

それは全く間違って何もが存在しないことが考えられ間違っている可能性が何のために損失のビットでよ。ここで

は、私は、ローカルマシン上で得るものです:

別ウィンドウで
gdbserver :0 /bin/date 
Process /bin/date created; pid = 132826 
Listening on port 57966 
Remote debugging from host 127.0.0.1 

:ここで何が起こっている

gdb -q /bin/date 
(gdb) target remote localhost:57966 
Remote debugging using localhost:57966 
Loading symbols for shared libraries. 
Loading symbols for shared libraries. 
0x00007ffff7ddb2d0 in _start() at rtld.c:871 
871 rtld.c: No such file or directory. 
(gdb) bt 
#0 0x00007ffff7ddb2d0 in _start() at rtld.c:871 
#1 0x0000000000000001 in ??() 
#2 0x00007fffffffe157 in ??() 
#3 0x0000000000000000 in ??() 

はgdbserverを非常に早い段階で劣る(デバッグされる)プロセスを停止したことです。ローダーがスタックをゼロにする前、そしてmainを入力する前。

メイン実行可能ファイルのシンボルは既に読み込まれているはずで、ブレークポイントを設定できるはずです。 mainにブレークポイントを設定してそこから続行すれば、すぐにブレークポイントがヒットするはずです。

更新:

私はそれが実行を開始し、私が接続したときに、メインのスタートでブレークすると予想。

あなたの期待は間違っています。

典型的なダイナミックリンクバイナリでは、_startの間に1000sの命令があり、mainになります。場合によっては、これらの命令はクラッシュが発生する命令です。ブレークポイントやウォッチポイントを設定する機会を与えずにGDBが自動的にmainに続く場合、そのようなクラッシュをデバッグすることは現在よりもはるかに難しくなります。

+0

@ rivenmyst137私は答えを更新しました。 –

0

リモートでデバッグするとき、gdbクライアントはシンボルの読み込み先を認識しません。次の2つのオプションがあります。

1. specify executable when starting gdb 

gdb <executable> 
(gdb) target remote <IP>:<port> 
(gdb) load <executable> 
gdb should know symbols now 
(gdb) b main 
(gdb) mon reset 
(gdb) contnue 
it should break at main 
(gdb) bt 

2. use file command to tell about the symbols. 

gdb 
(gdb) target remote <IP>:<port> 
(gdb) load <executable> 
(gdb) file <executable> 
gdb should know symbols now 
(gdb) b main 
(gdb) mon reset 
(gdb) contnue 
it should break at main 
(gdb) bt 
関連する問題