Linux:gdbデバッグ

gdb

gdb(GNUデバッガー)は、GNUオープンソース組織によってリリースされたLinuxでの強力なプログラムデバッグツールです。

  1. プログラムを開始します。カスタマイズした要件に従って、必要に応じてプログラムを実行できます。
  2. 指定したブレークポイントでデバッグプログラムを停止できるようにします。(ブレークポイントは条件式にすることができます)
  3. プログラムが停止すると、この時点でプログラムで何が起こったかを確認できます
  4. プログラムを変更してバグの影響を修正し、他のバグをテストできます

デバッグ与リリース

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  #打印当前的函数调用栈的所有信息

ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/huifaguangdemao/article/details/108428969