gdb
gdb(GNUデバッガー)は、GNUオープンソース組織によってリリースされたLinuxでの強力なプログラムデバッグツールです。
- プログラムを開始します。カスタマイズした要件に従って、必要に応じてプログラムを実行できます。
- 指定したブレークポイントでデバッグプログラムを停止できるようにします。(ブレークポイントは条件式にすることができます)
- プログラムが停止すると、この時点でプログラムで何が起こったかを確認できます
- プログラムを変更してバグの影響を修正し、他のバグをテストできます
デバッグ与リリース
Gdbは、実行可能ファイルのデバッグバージョンをデバッグします。ここでは、デバッグバージョンとリリースバージョンについて簡単に説明します。
生成された実行可能ファイルには、デバッグバージョンとリリースバージョンを含めることができます。デフォルトでgccによって生成されたリリースバージョン
デバッグバージョン:デバッグ情報が含まれ、最適化を行わないデバッグ可能なバージョン。開発者がプログラムをデバッグするのに便利です。
リリースバージョン:さまざまな方法で最適化されることが多いリリースバージョン。プログラムのコードサイズと実行速度が最適であり、ユーザーが使いやすく、1つのステップで実行することはできません。
デフォルトでgccによって生成されるリリースバージョン。コンパイル時に-gオプションを追加することでデバッグバージョンを生成できます。
gcc -g 源文件.c -o 指定的文件名
-gオプションと-oオプションは必須です。コンパイルとリンクを段階的に完了する場合は、-gオプションをコンパイル段階に追加する必要があります。
gdbの使用
1.gdbを使用してファイルを開きます
gdb debug版本的可执行文件 #gdb后面跟的必须是debug版本的可执行文件,否则会报错
2.ソースコードを表示する
list #list可以简写为l,用list默认查看main函数所在的代码
list 源代码文件 #查看指定文件的代码
list 源代码文件:行数 #查看指定文件指定行数周围10行的代码
list 文件名:函数名 #查看指定文件指定函数周围10行的代码
#命令一次只能显示十行,若想查看后面的源码可一直按回车键,直到所有源码显示完
ブレークポイント管理
1.ブレークポイントを追加します
b 行号 #将断点添加到最近一次显示的文件的指定行
b filename:行号 #将断点添加到filename的指定行
b functionname #将断点添加到指定函数的第一行
#b全称breakpoint
2.既存のブレークポイントの情報を表示します
info break #break可以简写为b
3.ブレークポイントを削除します
d 断点号 #删除指定的断点
4.条件付きブレークポイントを追加します
この種のブレークポイントは、特定の条件が満たされたときにトリガーされます。これは、例外調査により適しています。
break line-or-function if (condition)
b src/main.cpp:127 if cnt==10
5.ブレークポイントを無効に設定します
ブレークポイントを無効に設定してもブレークポイントは削除されません。必要に応じて引き続き有効にすることができます
disable [breakpoints] [range...] #disable可以简写为dis
ブレークポイントはブレークポイント番号です。何も指定されていない場合は、すべての停止ポイントが無効になっていることを意味します。短縮コマンドはdisです
6、ブレークポイントを復元します
無効化に対応するのは、無効として設定されたブレークポイントを有効にすることです。つまり、ブレークポイントを復元します。
enable [breakpoints] [range...]
enable once [breakpoints] #仅仅恢复断点一次,当程序停止后, 该断点马上被GDB自动删除
実行プロセス制御
1.デバッグを開始し、実行を開始します
run #可以简写为r
2.シングルステップ実行
next #逐过程,简写为n 调用函数的语句中:n直接执行完函数继续执行
step #逐语句,简写为s s进入函数一句一句执行
finish #直接将当前函数执行完成,退出到调用函数的下一条指令的位置
3.次のブレークポイントまで実行を継続します
c
4.ループを終了します
until #简写为u
5.デバッグを終了します
q
プログラム変数
変数の値を表示する
p valname
p &valname
p 数组名 #显示数组中所有元素的值
p 数组指针 #显示的是指针的值
1回実行pが1回表示され、pが実行されない場合は表示されません
変数タイプを表示
ptype valname
変数の値を自動的に表示します
display valname #每执行一次next或step,就显示一次
メモリアドレスに従ってメモリの保存値を表示します
x <addr> #<addr>表示一个内存地址
関数呼び出しスタックを表示する
bt #打印当前的函数调用栈的所有信息