gdbで実行中のプロセスをデバグする方法

gdbで実行中のプロセスをデバグする方法

Posted at November 20,2018 12:03 AM
Tag:[C++, gdb]

gdbで実行中のプロセスをデバグする方法を紹介します。

1.問題点

C++のサンプルプログラム(test.cc)を作りました。

#include <iostream>
 
int main() {
    while (1) {
        std::cout << "Hello World!!" << std::endl;
        sleep(3);
    }
    return 0;
}

コンパイルして、バイナリ(a.out)を作ります。

% g++ test.cc
% ls
a.out  test.cc

このプログラムをgdbでデバグするには、

% gdb a.out

という風に、gdbコマンドでバイナリファイルを起動させるか、コアダンプを利用して、

% gdb a.out コアダンプ

という風に、バイナリとコアダンプを指定する方法がありますが、実行中のプロセスにgdbで割り込んでデバグする方法が分かりません。

ということで、gdbで実行中のプロセスをデバグする方法を紹介します。

2.gdbで実行中のプロセスをデバグする

gdbで実行中のプロセスをデバグするには、まずプロセスIDを調べます。

% ps -ef | grep a.out
root     17982 17876  0 18:53 pts/2    00:00:00 ./a.out
root     17984 17955  0 18:53 pts/3    00:00:00 grep a.out

そしてgdbを起動するときに"-p"オプションでプロセスIDを指定すれば、実行中のプロセスをデバグできます。

% gdb -p 17982
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6)
Copyright (C) 2010 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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Attaching to process 17982
Reading symbols from /home/y-araki/test/a.out...(no debugging symbols found)...done.
Reading symbols from /usr/lib64/libstdc++.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib64/libstdc++.so.6
Reading symbols from /lib64/libm.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libm.so.6
Reading symbols from /lib64/libgcc_s.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/libgcc_s.so.1
Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
0x0000003fdaeacb70 in __nanosleep_nocancel () from /lib64/libc.so.6
(gdb)

gdbをオプションなしで起動し、attachコマンドでプロセスIDを指定する方法でも同じです。

# gdb
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6)
Copyright (C) 2010 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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) attach 17982
Attaching to process 17982
Reading symbols from /home/y-araki/test/a.out...(no debugging symbols found)...done.
Reading symbols from /usr/lib64/libstdc++.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib64/libstdc++.so.6
Reading symbols from /lib64/libm.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libm.so.6
Reading symbols from /lib64/libgcc_s.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/libgcc_s.so.1
Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
0x0000003fdaeacb70 in __nanosleep_nocancel () from /lib64/libc.so.6
(gdb)

この状態でbtを実行すれば、バックトレースが表示されます。

(gdb) bt
#0  0x0000003fdaeacb70 in __nanosleep_nocancel () from /lib64/libc.so.6
#1  0x0000003fdaeaca00 in sleep () from /lib64/libc.so.6
#2  0x000000000040087e in main ()

あとはgdbのコマンドを使って、色々制御することができます。

なお、gdbの起動直後(またはattach直後)、プログラムは停止した状態になるので、プログラムを再開させたい場合は"c"または"continue"を実行します。

(gdb) continue
Continuing.

再開後、gdbで制御したい場合は"Ctrl-c"でプラグラムを一旦停止させてください。

^C
Program received signal SIGINT, Interrupt.
0x0000003fdaeacb70 in __nanosleep_nocancel () from /lib64/libc.so.6
(gdb)

これで再びgdbで制御できます。

関連記事
zenback
人気エントリー
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)