GDBデバッグガイド

この記事では、最初に私の公共号に登場Linuxのクラウド・コンピューティング・ネットワーク(上記のIDを述べた:cloud_dev) 乾燥品のシェア、内側の数に焦点を当て10T、書籍やビデオリソース舞台裏返信を「1024」受け取るために、みんなの注目を歓迎し、二次元コードのテキストの終わりを掃引することができます。

00はじめに

GDB(GNUデバッガ)は、UNIXおよびUNIX風の下で強力なデバッグツールで、ADA、C、C ++、アセンブラ、最小限、D、FORTRAN、Objective-Cの、行く、のJava、Pascalと他の言語は、これはをデバッグすることができ、私たちを導きます主に、一例としてcを。

01基本

1.1プログラムをデバッグできるかどうかを判断します

# gdb helloworld
Reading symbols from helloWorld...(no debugging symbols found)...done.

# gdb helloworld
Reading symbols from helloWorld...done.

上記の種類のno debugging symbols found非試運転を表し、次のように調整可能です。

または情報のreadelfが表示片:

1# readelf -S helloworld|grep debug
2  [28] .debug_aranges    PROGBITS         0000000000000000  0000106d
3  [29] .debug_info       PROGBITS         0000000000000000  0000109d
4  [30] .debug_abbrev     PROGBITS         0000000000000000  0000115b
5  [31] .debug_line       PROGBITS         0000000000000000  000011b9
6  [32] .debug_str        PROGBITS         0000000000000000  000011fc

すべてのデバッグ情報が出力されていない場合は、デバッグすることができません。

1.2オープンgdbのコンパイル

プラス-gオプション:

gcc -g -o xxx xxx.c

デバッガに1.3 GDBのXXX

  • b 行号或函数 ブレークポイントを追加します。

  • r 次のブレークポイントに移動します

  • s シングルステップの追跡

  • n シングルステップ実行

  • p:現在のようなプログラムデータを実行している参照p aを提供することができる出力の可変出力フォーマットの値。たとえばp/d a、変数の出力の10進値を

  • p array@idx あなたには、配列の配列IDXの値を表示することができます

  • ディスプレイの設定、等display aこれは、変数のデバッグの各出力値の後になります

  • x 構文は、メモリアドレスを表示:X /

  • l元のプログラムコード、参照l 9附属書ソース線9(に記載されているl 2,8行2-8の間で記載されているデータ)を、l func指定された関数の添付ファイルのソースコードに記載されています

  • p x=8 発効以下、デバッグプロセスにおける変数xの値を変更

  • jump また、このフォーマット+ NUMジャンプアドレスであってもよく、ラインコードのメモリアドレス線れる:実現するジャンプファイルの行番号であってもよく、それはまた、ファイルとすることができます

  • signal 量信号を生成します

  • return 強制復帰

  • call 呼び出すために強制

  • until(简写u) ループの本体は、ループが実行を終了するとき

  • until +行号 だけではなく、ループの外に、停止した行を実行します

  • finish この機能を実行し、スタックのリターンアドレスを印刷した後、関数パラメータおよび他の情報の値を返します

  • skipいくつかのコードの機能をスキップするかのように、ステップ内のファイルに注力したくないskip function add、追加する機能の上に表現しskip file step.cたファイルstep.cをスキップし、info skip情報はスキップされ表示します。

  • c 次のブレークポイントにジャンプし続けます

  • bt スタックビュー

  • whereときにエラー何が悪かったのかを参照してください、とbt同様の

  • info b ビューのブレークポイントの状況

  • q やめます

  • ptype 出力構造タイプ

  • info registers表示レジスタの値は、info all-registersすべてのレジスタを表示します

  • info breakpoints あなたは、設定されているすべてのエンドポイントを表示することができます

1.5高度なコマンド

1.5.1ブレークポイントの設定

  1. info breakpoints すべてのブレークポイントを見ます
  2. b 9または、b test.c:9ブレークポイントを設定する行番号
  3. b func ブレークポイントの設定には、名前を機能します
  4. b test.c:9 if b==0 手順は、問題の状態、条件設定ブレークポイントであろう(問題が発生したときに、マスターカードは、問題かどうかを決定するために使用されるように)
  5. rbreak print*すべての印刷機能の始まりのためにブレークポイントを設定されているrbreak test.c:.すべての機能には、ブレークポイントを設定test.cの
  6. tbreak test.c:9設定し、一時的なブレークポイントのみブレークポイント後に有効になります
  7. ignore 1 30 時間を節約し、有効にするには、開始から30回、31回のブレークポイント、目の前を無視
  8. watch a 値または式の観察時に変更します
  9. disable/enable num 無効/すべて/ブレークポイントを有効にします
  10. clearなど、機能をオフにラインを破るために使用されるすべてのブレークポイントを、クリアclear funcclear linenum
  11. delete その数は、ブレークポイントを削除するために使用されるウォッチポイント、キャッチポイントを含む、すべてのブレークポイントを削除する、など delete bnum

1.5.2ビュー変数

  1. p 'test.c'::aバリアブル印刷ファイル、p 'main'::b変数定義された関数を印刷
  2. p *p@10 コンテンツポインタ、後の印刷の長さを印刷@
  3. p *$.next リストlinkNodeに次のノードの内容を印刷
  4. p/x c 進印刷コンテンツ(X:16進数、D:小数点以下、O:オクタル、T:バイナリ、C:文字形式、F:浮動小数点形式)
  5. x addr ビューメモリアドレス値
  6. display e プログラムは変数の値を表示オフライブ

1.5.3 [ソースの編集]

デバッガを起動した後、ソースコードエディタ、それを行う方法を、プログラムを終了したくありませんか?

GDBモードのデフォルトのエディタが使用されている/bin/ex、または全くそのようなVIMなど他のエディタに置き換えたい場合、ことができます。

export EDITOR=/usr/bin/vim

GDBモードの下でソースコードを編集するには:

(gdb)edit 3  # 编辑第三行
(gdb)edit func # 编辑func函数
(gdb)edit test.c:5 #编辑test.c第五行

完成後は、(プログラムを再コンパイルするシェルコマンドを示し、シェルコマンドを持参してください注意してください):

(gdb)shell gcc -g -o main main.c test.c

それとも、この:

スタートは、TUI(テキストユーザーインターフェイス)をもたらすことです、あなたは複数のウィンドウをデバッグすることができます。

gdb main -tui

1.6デバッグパラメータ

パラメータの最後の1. [スタート時間

gdb --args xxx 参数

ベルト走行後2.スタートパラメータ

# gdb xxx
(gdb)run 参数

3.セット引数が起動パラメータを設定した後

# gdb xxx
(gdb) set args 参数

02マルチプロセスのデバッグ

2.1方法を添付

  1. まずデバッグする子プロセスを見つける:ps -ef | grep xxxまたはpidofプロセス名
  2. 入力gdbモードに入りますattach pid
  3. デバッガに実行して、ポイントを破ります

それとも単にこの:gdb <program> pid(またはgdb <program> --pid pid)、gdbが自動的に添付してください。

間違いがある場合:

Could not attach to process.  If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user.  For more details, see /etc/sysctl.d/10-ptrace.conf
ptrace: Operation not permitted.

に、ルートに切り替え/etc/sysctl.d/10-ptrace.conf

kernel.yama.ptrace_scope = 1

読みます:

kernel.yama.ptrace_scope = 0

2.2フォローフォークモードのモード方法

  1. 入力しgdb、モードを入力set follow-fork-mode mode(モードオプションの親、子、親や子供がデバッグプロセスを表します)
  2. ブレークポイント

2.3プログラムを実行するために、デバッグ

これは通常、デバッグ情報プログラムを実行されていないが、あなたは現在のプログラム再開デバッグを停止することができない場合は、次のことができます。

その後、同じコード、およびデバッグ情報とバージョンをコンパイルし、次のようになります。

# gdb
(gdb) file hello
Reading symbols from hello...done.
(gdb)attach 20829

03デバッグマルチスレッド

gdb マルチスレッドのデバッグを支援することができますコマンドのセットがあります:

  • info threads:「*」の現在のスレッド調整可能なフロントスレッドIDのすべてが、現在のスレッドがデバッグされていることを示して表示します。
  • thread id:デバッグターゲットID指定されたスレッド
  • set scheduler-locking [on|off|step]:マルチスレッド環境では、実行するために複数のスレッドがあるだろう、これは、複数のスレッドをデバッグするときの状況を設定するには、このコマンドを実行し、スレッドのデバッグの結果に影響するonだけで、現在のスレッドのデバッグを継続する、表現するoff彼らはシールドしていないと述べました任意のスレッド、すべてのスレッドを実行することができる、step単一の工程で、現在のスレッドのみが実行されると述べました。

04コアダンプデバッグ

コアダンプデバッグがコアファイルは、プログラム、不正な実行後のコアダンプファイルの後に生成され、コアファイルに依存します。これは、Linuxシステムでも、あなたはこれらをさせることができ、最後の障壁、コアファイルを提供し、多大な労力を開発し、テストするための費用の一部は、問題が発生した見つけることができなかった場合でも、防御機構のLinuxシステムであり、目に見える問題。

4.1オープン・コア・ダンプ

あなたは、プログラムがクラッシュしたい時にコアファイルを生成するには、イネーブル入力ulimit -c、出力はデフォルトのコア・ダンプではオフを示し、0であれば、。

開くには2つの方法があり、1は、ulimitコマンドによって、最初の終わりについての話、オープンプログラムでコードを書くことであるが、ここではテキストへの第二の基準は、1を参照しました

ulimit -c unlimied  # 表示不限制core文件大小
ulimit -c 10        # 设置最大大小,单位为块,一块默认为512字节

上記は、修正するために恒久的に開いて、一時的に開いている/etc/security/limits.conf行を追加し、ファイルを:

# /etc/security/limits.conf
# <domain>        <type>  <item>  <value>
    *               soft    core    unlimited

これは、ディレクトリを指定したい場合は、あなたがすることができ、ファイル名はコアであり、かつ現在のプログラムディレクトリにデフォルトで生成され、コアファイルが生成されますecho "/tmp/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern「を/ tmp /コアファイル」、ファイル名の形式は、「コア-あるディレクトリに保存されたコアファイルを設定しますコマンド名-pid-タイムスタンプ」

また、することができecho 1 > /proc/sys/kernel/core_uses_pidたファイルを作ることはコアとなりcore.pid、PIDプロセスのpidです。

4.2コア・ダンプをデバッグします

使用

gdb <program> core文件名

GDBまたは使用を開始した後

  • -core <file>
  • -c <file>

コアファイルをデバッグするには

次に例を示します。

#include <stdio.h>
int func(int *p)
{
    int y = *p;
    return y;
}
int main()
{
    int *p = NULL;
    return func(p);
}

コンパイル:gdb -g -o core_dump core_dump.cgdbでコアファイルを表示

root@root:~$ gcc core_demo.c -o core_demo -g
root@root:~$ ./core_demo 
Segmentation fault (core dumped)

root@root:~$ gdb core_demo core_demo.core.24816
...
Core was generated by './core_demo'.
Program terminated with signal 11, Segmentation fault.
#0  0x080483cd in func (p=0x0) at core_demo.c:5
5       int y = *p;
(gdb)  where
#0  0x080483cd in func (p=0x0) at core_demo.c:5
#1  0x080483ef in main () at core_demo.c:12
(gdb) info frame
Stack level 0, frame at 0xffd590a4:
 eip = 0x80483cd in func (core_demo.c:5); saved eip 0x80483ef
 called by frame at 0xffd590c0
 source language c.
 Arglist at 0xffd5909c, args: p=0x0
 Locals at 0xffd5909c, Previous frame's sp is 0xffd590a4
 Saved registers:
  ebp at 0xffd5909c, eip at 0xffd590a0
(gdb) 

あなたは私たちがシーンcore_demoの実行を復元できることを確認し、プログラムは、あなたが使用することもでき、GDBは、情報がレジスタ変数を表示するコマンドが現在のスタックフレームを表示するには、関数を呼び出すことができます。

よくある質問

質問1

ときGDBデバッグを開きます。

Missing separate debuginfos, use: debuginfo-install libgcc-4.8.5-28.el7_5.1.x86_64 numactl-libs-2.0.9-7.el7.x86_64

ソリューション:

  1. ファイルを変更/etc/yum.repos.d/CentOS-Debuginfo.repoしてenabled1値を変更し、パラメータ
  2. yum install nss-softokn-debuginfo --nogpgcheck
  3. debuginfo-install glibc以下の質問が発生した場合:-bash: debuginfo-install: command not foundインストールされているyum-utils、次のコマンドを使用します。yum install yum-utils
  4. ライブラリは二つの質問プロンプトインストールされました:use: debuginfo-install libgcc-4.8.5-28.el7_5.1.x86_64 numactl-libs-2.0.9-7.el7.x86_64

参照

1つの要約の下に、Linuxのコア・ダンプ

2 Linuxのコアダンプ

3 GDB用デバッグツール


いいえ公共の返信「プラスグループは、」クリア交換基にあなたを取りません

私のパブリック番号「Linuxのクラウド・コンピューティング・ネットワーク」(上記のidは:cloud_dev) インナー数10T書籍やビデオリソース、舞台裏の返信「1024」は受け取りを含むが、Linuxに限定されるものではなく、コンテンツを共有するには、ネットワーキング、クラウドコンピューティング、仮想化、コンテナの内容はドッカー、OpenStackは、Kubernetes、ツールは、SDN、OVS、DPDK、ゴーやPython、C / C ++ プログラミング技術、我々は注意を歓迎します。

おすすめ

転載: www.cnblogs.com/bakari/p/11571480.html