記事ディレクトリ
まず、GDBの機能
GDB は主に次の機能を実行します。
1、自由启动程序;
2、程序可在指定的断点处停住;
3、程序被停住时,可以获取此时程序的信息、查看变量值;
4、可单步调试,检查每步的结果。
2. デバッグ情報の追加方法
GDB は C/C++ プログラムをデバッグするため、プログラムをより適切にデバッグするには、コンパイル時にデバッグ情報を実行可能ファイルに追加する必要があります。つまり、コンパイラの -g パラメータを使用します。好き:
1、C语言:gcc -g hello.c -o hello
2、C++:g++ -g hello.cpp -o hello
-g がない場合、プログラムの関数名と変数名は表示されず、実行時のすべてのメモリ アドレスが置き換えられます。
3.シグナルと割り込み
シグナルは、次のような非同期イベントを処理する方法であるソフト割り込みです。
SIGINT:中断字符信号,Ctrl+C;
SIGBUS:硬件故障的信号;
SIGCHLD:子进程状态改变信号;
SIGKILL:终止程序运行的信号。
上記のシグナルのいずれかを処理するには、handle コマンドを使用します。そのパラメーターは次のとおりです。
Nostop:处理该信号时,GDB会打印消息告诉你收到这种信号;
Stop:处理该信号时,GDB会停住你的程序;
Print:处理该信号时,GDB会显示出一条信息;
Noprint:处理该信号时,GDB不会告诉你收到信号的信息;
Pass/noignore:处理该信号时,GDB不处理信号;
Nopass/ignore:处理该信号时,GDB不会让程序处理这个信号。
注文:
info signals/info handle:查看有哪些信号在被GDB检测中。
場合:
handle SIGPIPE noprint nostop
handle SIGUSR2 noprint nostop
四、GDBコマンド
4.1 機能分割
機能は主に次のカテゴリに分類されます。
breakpoints:断点设置类
data:数据查看类
files:指定并查看文件类
internals:维护命令类
running:程序执行类
stack:调用栈查看类
statu:状态查看类
tracepoints:跟踪程序执行类
4.2 デバッグ方法
- gdb <program>
プログラムは実行可能ファイルです - gdb < program > core
gdb を使用して、実行中のプログラムとコア ファイルを同時にデバッグします。core は、プログラムの不正な実行後にコア ダンプ後に生成されるファイルです。 - gdb <program> <PID>
プログラムがサービス プログラムの場合、サービス プログラムの実行時にそのプロセス ID を指定できます。gdb は自動的にアタッチしてデバッグします - gdb <program>
関連のソース コード、および gdb - gdb attach < PID >
attach コマンドを使用してプロセスの PID をマウントし、detach を使用してマウントされたプロセスをキャンセルします
4.3 共通コマンド
注文 | 言い換え |
---|---|
t | ピッド |
へ | スタック番号 |
分解する | 分解 |
スレッド適用すべて bt | すべてのスレッド スタックを印刷する |
猫 /proc/2498/maps | 指定された pid のアドレスを出力します |
情報スレッド | 現在デバッグ可能なすべてのスレッドを表示 |
情報フレーム | スタック フレーム情報を表示する |
bt | スタック |
情報スレッド | 現在デバッグ可能なすべてのスレッドを表示 |
スレッド PID | 現在デバッグ中のスレッドを、指定された PID を持つスレッドに切り替える |
情報処理 | 現在のプログラムの実行可能ファイルに関する情報を表示します |
4.4 サスペンド操作
プログラムをデバッグする場合、プログラムの実行を一時停止する必要がありますが、GDB はプログラムの実行を簡単に一時停止できます。プログラムが停止する場所、条件、シグナルの受信時期などを設定できます。実行時の変数と実行時のプロセスを表示できるようにします。
プロセスが gdb によって停止されると、info プログラムを使用して、プログラムが実行されているかどうか、プロセス番号、および中断された理由を確認できます。
gdb では、次の一時停止メソッドを使用できます: ブレークポイント (BreakPoint)、ウォッチポイント (WatchPoint)、キャプチャ ポイント (CatchPoint)、シグナル (シグナル)、スレッド停止 (スレッド停止)。
プログラムの動作を再開したい場合は、c または continue コマンドを使用できます。
4.4.1 ブレークポイントの設定方法
1、break <function> 在指定函数处停住
2、break <linenum> 在指定行号停住
3、 break filename:linenum 在源文件 filename 的linenum行处停住
4、 break filename:function 在源文件 filename 的function函数的入口处停住
5、 break *address 在程序运行的内存地址处停住
6、 break break命令没有参数时,表示在下一条指令处停住
7、 break ... if <condition>
...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序
4.4.2 ブレークポイントの表示方法
以下に示すように、info コマンドを使用します (注: n はブレークポイント番号を表します)。
info breakpoints [n]
info break [n]
4.4.3 ウォッチポイント
ウォッチポイントは、式の値が変更されたかどうかを監視するために使用され、変更された場合はすぐにプログラムを停止します。
ウォッチポイントを設定するには、いくつかの方法があります。
1、watch <expr>
为表达式(变量)expr 设置一个观察点。一量表达式值有变化时,马上停住程序
2、rwatch <expr>
当表达式(变量)expr被读时,停住程序
3、awatch <expr>
当表达式(变量)的值被读或被写时,停住程序
info watchpoints: 現在設定されているすべてのウォッチポイントを一覧表示します