トップページへ

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

小粋空間 » Programming Language » C/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で制御できます。

« 前の記事へ

次の記事へ »

トップページへ