gdbデバッガのLinuxのC

gdbの概要

GDBデバッグツールは、強力なUNIX GNUオープンソースリリースの下のプログラムです。おそらく、あなたはなどVC、BCBのIDEを、デバッグするように、グラフィカルなインターフェイスの種類を好むが、あなたはUNIXプラットフォームでソフトウェアを実行している場合、あなたはgdbデバッガツールVCよりも、BCBグラフィカルなデバッガがありますパワフル。いわゆる「ディレクターインチ、短い足を持っている」真実です。

一般的には、次の4つの側面の主な機能を完成助けるためにgdbを:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。

それはそうの上、GDBデバッグツールと一般的な無異なるが、基本的にこれらの機能を実現するが、詳細には、あなたがこの強力なGDB用デバッグツールを見つけるだろう、我々はグラフィカルなデバッグツールに慣れかもしれないが、そこにありますデバッグ時にコマンドラインツールを完了することはできませんが、それは、グラフィカルなツールとしての機能を有します。私たちはそれはそう持ってみましょう。

GDBデバッグ例

ソースgdb_test1.c

  1 #include<stdio.h>                                                                                      
  2 
  3 int func(int n)
  4 {
  5     int sum=0,i;
  6     for(i=1;i<=n;i++)
  7     {
  8         sum+=i;
  9     }
 10     return sum;
 11 }
 12 
 13 
 14 main()
 15 {
 16     int i;
 17     long result=0;
 18     for(i=1;i<=100;i++)
 19     {
 20         result+=i;
 21     }
 22 
 23     printf("result[1-100]=%d \n",result);
 24     printf("result[1-250]=%d \n",func(250));
 25 }

一般的なGDBデバッガでは主にC / C ++プログラムです。C C ++プログラム/をデバッグするには、最初のコンパイル時に、我々は、実行可能ファイルにデバッグ情報を配置する必要があります。コンパイラ(CC / gccを/グラム++)それを行うことができます-gパラメータです。以下のような:

>g++ -g gdb_test1.c -o gdb_test1
>cc -g gdb_test1.c -o gdb_test1

実行可能ファイルをコンパイルしました。ここでは、使用します

> g++ -g gdb_test1.c -o gdb_test1

GDBデバッグを使用します:

root@f49:/home/fhj/mycode# gdb gdb_test1  <---------- 启动GDB
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 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-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from gdb_test1...done.
(gdb) l   <-------------------- l命令相当于list,从第一行开始例出原码。
3	int func(int n)
4	{
5		int sum=0,i;
6		for(i=1;i<=n;i++)
7		{
8			sum+=i;
9		}
10		return sum;
11	}
12	
(gdb)    <-------------------- 直接回车表示,重复上一次命令
13	
14	main()
15	{
16		int i;
17		long result=0;
18		for(i=1;i<=100;i++)
19		{
20			result+=i;
21		}
22	

(gdb) break 16   <-------------------- 设置断点,在源程序第16行处。
Breakpoint 1 at 0x40055c: file gdb_test1.c, line 16.
(gdb) break func  <-------------------- 设置断点,在函数func()入口处。
Breakpoint 2 at 0x40052d: file gdb_test1.c, line 5.
(gdb) info break   <-------------------- 查看断点信息。
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040055c in main() at gdb_test1.c:16
2       breakpoint     keep y   0x000000000040052d in func(int) at gdb_test1.c:5
(gdb) r  <--------------------- 运行程序,run命令简写
Starting program: /home/fhj/mycode/gdb_test1 

Breakpoint 1, main () at gdb_test1.c:17  <---------- 在断点处停住
17		long result=0;
(gdb) n  <--------------------- 单条语句执行,next命令简写。
18		for(i=1;i<=100;i++)
(gdb) n
20			result+=i;
(gdb) n
18		for(i=1;i<=100;i++)
(gdb) n
20			result+=i;
(gdb) c   <--------------------- 继续运行程序,continue命令简写(结束本次循环)
Continuing.
result[1-100]=5050  <----------程序输出。

Breakpoint 2, func (n=250) at gdb_test1.c:5
5		int sum=0,i;
(gdb) n
6		for(i=1;i<=n;i++)
(gdb) p i  <--------------------- 打印变量i的值,print命令简写。
$1 = 32767
(gdb) n
8			sum+=i;
(gdb) n
6		for(i=1;i<=n;i++)
(gdb) p sum
$2 = 1
(gdb) n
8			sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6		for(i=1;i<=n;i++)
(gdb) p sum
$4 = 3
(gdb) bt  <--------------------- 查看函数堆栈。
#0  func (n=250) at gdb_test1.c:6
#1  0x00000000004005a0 in main () at gdb_test1.c:24
(gdb) finish   <--------------------- 退出函数
Run till exit from #0  func (n=250) at gdb_test1.c:6
0x00000000004005a0 in main () at gdb_test1.c:24
24		printf("result[1-250]=%d \n",func(250));
Value returned is $5 = 31375

(gdb) c  <--------------------- 继续运行。
Continuing.
result[1-250]=31375   <----------程序输出
[Inferior 1 (process 2907) exited normally]  <--------程序退出,调试结束

(gdb) quit   <--------------------- 退出gdb。

GDBを使用して

  • デバッグをコンパイルします

一般的なGDBデバッガでは主にC / C ++プログラムです。C C ++プログラム/をデバッグするには、最初のコンパイル時に、我々は、実行可能ファイルにデバッグ情報を配置する必要があります。コンパイラ(CC / gccを/グラム++)それを行うことができます-gパラメータです。以下のような:

> cc -g hello.c -o hello
> g++ -g hello.cpp -o hello

ノー-g場合、あなたは、実行時のメモリアドレスに置き換えされているすべてのそれらの変数名を、Functionプロシージャの名前は表示されません。あなたが使用する場合-gデバッグ情報が追加され、成功したオブジェクト・コードをコンパイルした後、のは彼のデバッグにgdbを使用する方法を見てみましょう。

  • スタート
对C/C++程序的调试,需要在编译前就加上-g选项:
$g++ -g hello.cpp -o hello
       program也就是你的执行文件,一般在当前目录下。
$gdb <program> <core dump file>
$gdb program core.11127
       用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
 $gdb <program> <PID>
 $gdb hello 11127
	如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

gdbの対話型コマンド

対話モードに入るように、GDBを起動した後、プログラムは、次のデバッグコマンドによって完成される。なお、高次通常使用される略語、効率を向上させるデバッグコマンドに精通して、これらの略語。

ラン

  • 実行:ブレークポイントに遭遇したときに、その役割は、プログラムを実行することで、R、と略称、プログラムは次のユーザ入力コマンドを待って、ブレークポイントで実行を停止します。
  • 引き続き(略称C):次のブレークポイントに進む(または実行の終わり)
  • 次:( N-略記する)、シングルステップ追跡プログラム、関数呼び出しが発生したとき、この機能は、身体に入らない;このコマンドの主な違いは、関数にステッピング、同じステップ、ステップ遭遇するユーザ定義関数であります実行すると、次の関数を直接呼び出すために、それは関数の本体の中に入りません。
    STEP(略称S):単一ステップ関数呼び出し、関数進む場合、n個の異なるコマンドは、N個の関数呼び出しが入らないです
  • まで:あなたはシングルステップトラッキングループ本体の間に疲れたとき、あなたがループを終了するまで、このコマンドは、プログラムを実行することができます。
    +行番号-until:行に、ではないためのループを使い果たし
  • 仕上げ:現在の関数の戻りが完了するまでプログラムを実行し、印刷スタックリターンアドレスと機能情報の値と引数の値を返します。
  • コール機能(パラメータ):発信者可視関数、及び「パラメータ」を通過し、例えば:(55)gdb_test呼び出し
  • Qと略記、GDBを終了します。quit

ブレークポイントを設定

  • BREAK N(略称BN):n行目にブレークポイントを設定する
    (コード・パスとコードネームをもたらすことができる:OAGUPDATE.cpp B:578)
  • BのFN1> Bの場合:I = 3の場合のブレークポイント条件B 13を設定し、ライン13 iが= 3は、ブレークポイントで提供される場合
  • ブレークFUNC(略称Bを破る):cb_buttonを破る:のような、入口で)(関数funcにブレークポイントを設定します
  • ブレークポイント番号を削除するn個:n番目の削除ブレークポイント
  • ブレークポイント数nを無効:n番目のブレークポイントポーズ
  • ブレークポイントの数nを有効にします。n番目のオープン・ブレーク
  • クリアライン数N:クリアブレークポイントのn行目
  • 情報B(情報がブレークポイント):ブレークポイントが現在の番組を表示するように設定されている場合
  • ブレークポイントを削除します。すべてのブレークポイントをクリアします。

ソースを表示

  • リスト:Lと略されるが、その役割は、プログラムのソースコード、デフォルトの表示ごとに10行に記載されています。
  • 行番号のリストは、次のような中央の縦線10、現在のファイル「行番号」を示しています。リスト12であります
  • 関数名のリスト:メインリスト:機能のような、「機能」のソースコードを表示します
  • リスト:パラメータなし、listコマンドの最後、以下の内容を出力します。

プリント式

  • print式:Pと略記、「表現」は、任意の有効な式は、現在、このようなC言語プログラムなどのプログラムは、現在デバッグ中のテストされていることができ、その後、「表現」はC言語の任意の有効な式を指定できますデジタル、変数あるいは関数呼び出しを含みます。
  • 印刷:値の整数が表示されます
  • 印刷++:1値の増加、および表示されます
  • 印刷名:文字列名の値が表示されます。
  • 印刷gdb_test(22):整数図22は、パラメータとしてgdb_test()を呼び出します
  • 印刷gdb_test(A):引数として変数を呼び出すgdb_test()関数
  • 表示式は:単一ステップ動作に有用である、表示式を設定するコマンドの後に、それが発現し、出力値が続く各シングルステップ命令が、設定された後になります。以下のような:表示します
  • 表現ウォッチ:ウォッチポイントを設定し、一度GDBは強制的にデバッグ中のプログラムを終了し、「表現」の変化値を監視しました。以下のような:見ます
  • whatisは:クエリ変数や関数
  • 情報機能:クエリ機能
  • 拡張情報の地元の人々:現在のスタックページの表示されたすべての変数

情報クエリが実行されます

  • ここで、/ BT:現在実行中のスタックリスト。
  • BTバックトレースは、現在のコールスタックを表示します
  • アップ/スタック表示の深さを変更するにはダウン
  • 引数パラメータを設定します。実行時にパラメータを指定します
  • ショーの引数:チェックインセットパラメータ
  • infoプログラム:プログラムが実行されているかどうかを確認するには、プロセスIDが、その理由は中断されています。

分割ウィンドウ

  • レイアウト:分割ウィンドウが、あなたはコード側、テストの側面を見ることができます。
  • レイアウトSRC:ソースコード表示ウィンドウ
  • レイアウトASMは:逆アセンブルし、ウィンドウを表示します
  • レイアウトREGS:ソース/分解し、CPUレジスタウィンドウを表示
  • レイアウト分割:ソースコードおよび逆アセンブリウィンドウを表示
  • Ctrlキーの+のL:リフレッシュウィンドウ

ノート

直接行動の対話モードは非常に便利なステッピングのためのリピート命令で入力してください。

:より転載https://blog.csdn.net/haoel/article/details/2879
https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html

おすすめ

転載: blog.csdn.net/qq_35429629/article/details/90348792