Gdbが例外をキャッチするたびに迷惑なエラーが表示されます。私は次のサンプルプログラムを実行しました
#include <stdexcept>
int main() {
throw std::invalid_argument("");
return 0;
}
そして、gdbを実行した結果は
terminate called after throwing an instance of 'std::invalid_argument'
what():
Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
それほど悪いわけではありません。必要な情報を手に入れているので、私を悩ませているだけです...
誰もこれを修正する方法を知っていますか?
UbuntuでCライブラリの完全なソースコードデバッグを行うには、以下を行う必要があります。
1)libc6のdebuginfoバージョンをインストールします。
おそらく既にインストールされていますが、インストールされていない場合は、Sudo apt install libc6-dbg
。
2)インストールされているCライブラリのバージョンに対応するソースコードをダウンロードします。
最初に、任意の場所にディレクトリを作成します-/opt/src
ここに。次に、以下を実行します。
Sudo apt install dpkg-dev
cd /opt/src
apt source libc6
find $PWD -maxdepth 1 -type d -name 'glibc*'
この名前を覚えておいてください-/opt/src/glibc-2.23
次に、gdbを実行し、停止するまでプログラムを実行します。gdbプロンプトで次のようにします。
(gdb) info source
Current source file is ../sysdeps/unix/sysv/linux/raise.c
Compilation directory is /build/glibc-KM3i_a/glibc-2.23/signal
そのため、gdbは、ソースコードが配置場所とは異なるディレクトリにあることを期待しています。これを修正するには2つの方法があります。
a)シンボリックリンクを移動または使用して、ソースコードが/build/glibc-KM3i_a/glibc-2.23
。
b)gdbに正しいソースディレクトリパス名を置き換える方法を指示します。
(gdb) set substitute-path /build/glibc-KM3i_a/glibc-2.23 /opt/src/glibc-2.23
フレームに戻り、gdbにソースコードの行が表示されます。
(gdb) frame 1
#1 0xb7e2fea9 in __GI_raise (sig=6) at ../sysdeps/unix/sysv/linux/raise.c:54
return INLINE_SYSCALL (tgkill, 3, pid, selftid, sig);