【Linuxデバッガ-gdb使用】

目次

1. 背景

2.使用する

 3 コマンド概要


1.背景

C言語の学習を通じて、プログラムをリリースするにはデバッグモードとリリースモードの2つの方法があり、デバッグモードはデバッグモードと呼ばれるものです。WindowsプラットフォームでのVSシリーズのデバッグについてはすでにおなじみですが、次はLinuxでグラフィカルインターフェイスを使用せずにデバッグする方法を見てみましょう!


2.使用する

まず、c++ ファイルを作成し、コードを書き込みましょう。

 #include<iostream>
  2 using namespace std;
  3 
  4 int AddSum(int& n)                                                                                                                      
  5 {
  6   int sum=0;
  7   for(int i=1;i<=n;i++)
  8   {
  9     sum+=i;
 10   }
 11   return sum;
 12 }
 13 
 14 int main()
 15 {
 16   int num=10;
 17   int sum=AddSum(num);
 18   cout<<sum<<endl;
 19   return 0;
 20 }

それを実行します:

[grm@VM-8-12-centos lesson3]$ g++ test.cpp
[grm@VM-8-12-centos lesson3]$ ll
total 16
-rwxrwxr-x 1 grm grm 8960 Jan  4 22:12 a.out
-rw-rw-r-- 1 grm grm  219 Jan  4 22:11 test.cpp
[grm@VM-8-12-centos lesson3]$ ./a.out
55

次に、デバッグ情報を追加します。

デバッグ情報を追加した後、ファイルのサイズが明らかに変化したことがはっきりとわかります。

注: gdbデバッグ使用するには、ソース コードからバイナリ プログラムを生成するときに-gオプションを追加する必要があります。

次にデバッグを開始します: gdb+ binFile (実行可能ファイル)

終了: ctrl + d または 終了
[grm@VM-8-12-centos lesson3]$ gdb a.out
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 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/>...
Reading symbols from /home/grm/lesson3/a.out...done.
(gdb) l
7	  for(int i=1;i<=n;i++)
8	  {
9	    sum+=i;
10	  }
11	  return sum;
12	}
13	
14	int main()
15	{
16	  int num=10;
(gdb) r
Starting program: /home/grm/lesson3/a.out 
55
[Inferior 1 (process 11983) exited normally]
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64 libgcc-4.8.5-44.el7.x86_64

ここでの l は、list/l 行番号: binFile のソースコードを表示し、最後に 10 行ずつ表示します。

r:  r または run: プログラムを実行します(VS の f5 に似ています)

より一般的に使用される 2 つのコマンド、n と s を紹介しましょう。

n または next: 単一実行   (プロセスごと、VS では f10)
s またはステップ: 関数呼び出しを入力します  (ステートメントごと、VS では f11)

これら 2 つのコマンドを導入する前に、ブレークポイント コマンドbreak(b) 行番号を導入する必要があります。特定の行にブレークポイントを設定します。

もちろん、指定したファイル内の行や関数を分割することも可能です: b ファイル名: 関数名(行番号)

 9 行目にブレークポイントを設定し、9 行目まで実行して、コードを 1 ステップずつ読むこともできます。

 しかし、変数の値を観測できないことがわかりました。では、どうすればよいでしょうか。

display variable name: track を使用して変数を表示し、停止するたびにその値を表示できます

(gdb) display sum
1: sum = 1
(gdb) display i
2: i = 1
(gdb) n

Breakpoint 1, AddSum (n=@0x7fffffffe448: 10) at test.cpp:9
9	    sum+=i;
2: i = 2
1: sum = 1
(gdb) n
7	  for(int i=1;i<=n;i++)
2: i = 2
1: sum = 3
(gdb) n

Breakpoint 1, AddSum (n=@0x7fffffffe448: 10) at test.cpp:9
9	    sum+=i;
2: i = 3
1: sum = 3

ディスプレイで変数名を表示すると、プロセスが実行されるたびにディスプレイ変数が出力されることがわかります。キャンセルするには、undisplay + 変数名を使用します。

ジャンプしたい行数にジャンプするために until を使用することもできます: until X line number: jump to X line

ジャンプした行数までプログラムを実行します。

この関数を実行した後に停止したい場合は、次を使用できます

あるブレークポイントから別のブレークポイントまで実行するには、次を使用します: continue(c)


 3 コマンド概要

さらに、下に降りて自分で学ぶことができるいくつかの指示があります. 参照用にここに表をリストしました:

リスト / l 行番号
binFile のソース コードを 表示 してから、最後の位置まで下に移動し、毎回 10 行ずつリストします。
リスト / l 関数名
関数のソース コードを一覧表示する
r または 実行
プログラムを実行する
n または
単一実行 (プロセスごと)
s または ステップ
関数呼び出しにステップ インする (ステートメントごと)
break(b)  行番号
行にブレークポイントを設定する
ブレーク  機能名
関数の先頭にブレークポイントを設定する
情報ブレーク
ブレークポイント情報を表示する
終了
現在の関数が戻るまで実行し、それから停止してコマンドを待ちます
プリント(p)
式の値を出力します。変数の値を変更したり、関数を式から呼び出すことができます
p 変数
変数値を出力
どこを見る
変数の値を変更する
続行 ( または c)
プログラムをステップ実行する代わりに、現在の位置から次のブレークポイントまで実行します
ブレークポイントを削除する
すべてのブレークポイントを削除
ブレークポイントを削除 n
: 通し番号 nのブレークポイントを削除します (通し番号は行数ではありません)。
ブレークポイントを無効にする
ブレークポイントを無効にする
ブレークポイントを有効にする
ブレークポイントを有効にする
info ( または i) ブレークポイント
現在設定されているブレークポイントを確認する
表示  変数名
変数をトレースし、停止するたびにその値を表示します
非表示
以前に設定された変数を追跡しない
X 行番号まで
X 行番号まで
ブレークトレース ( または bt)
すべてのレベルで関数呼び出しとパラメーターを表示する
info i) 地元の人
現在のスタック フレームのローカル変数の値を表示する
終了/Ctrl+d
gdb を終了する

おすすめ

転載: blog.csdn.net/m0_68872612/article/details/128555063