この記事では、最初に私の公共号に登場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ブレークポイントの設定
info breakpoints
すべてのブレークポイントを見ますb 9
または、b test.c:9
ブレークポイントを設定する行番号b func
ブレークポイントの設定には、名前を機能しますb test.c:9 if b==0
手順は、問題の状態、条件設定ブレークポイントであろう(問題が発生したときに、マスターカードは、問題かどうかを決定するために使用されるように)rbreak print*
すべての印刷機能の始まりのためにブレークポイントを設定されているrbreak test.c:.
すべての機能には、ブレークポイントを設定test.cのtbreak test.c:9
設定し、一時的なブレークポイントのみブレークポイント後に有効になりますignore 1 30
時間を節約し、有効にするには、開始から30回、31回のブレークポイント、目の前を無視watch a
値または式の観察時に変更しますdisable/enable num
無効/すべて/ブレークポイントを有効にしますclear
など、機能をオフにラインを破るために使用されるすべてのブレークポイントを、クリアclear func
、clear linenum
delete
その数は、ブレークポイントを削除するために使用されるウォッチポイント、キャッチポイントを含む、すべてのブレークポイントを削除する、などdelete bnum
1.5.2ビュー変数
p 'test.c'::a
バリアブル印刷ファイル、p 'main'::b
変数定義された関数を印刷p *p@10
コンテンツポインタ、後の印刷の長さを印刷@p *$.next
リストlinkNodeに次のノードの内容を印刷p/x c
進印刷コンテンツ(X:16進数、D:小数点以下、O:オクタル、T:バイナリ、C:文字形式、F:浮動小数点形式)x addr
ビューメモリアドレス値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方法を添付
- まずデバッグする子プロセスを見つける:
ps -ef | grep xxx
またはpidof
プロセス名 - 入力
gdb
モードに入りますattach pid
- デバッガに実行して、ポイントを破ります
それとも単にこの: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フォローフォークモードのモード方法
- 入力し
gdb
、モードを入力set follow-fork-mode mode
(モードオプションの親、子、親や子供がデバッグプロセスを表します) - ブレークポイント
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.c
gdbでコアファイルを表示
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
ソリューション:
- ファイルを変更
/etc/yum.repos.d/CentOS-Debuginfo.repo
してenabled
1値を変更し、パラメータ yum install nss-softokn-debuginfo --nogpgcheck
debuginfo-install glibc
以下の質問が発生した場合:-bash: debuginfo-install: command not found
インストールされているyum-utils
、次のコマンドを使用します。yum install yum-utils
- ライブラリは二つの質問プロンプトインストールされました:
use: debuginfo-install libgcc-4.8.5-28.el7_5.1.x86_64 numactl-libs-2.0.9-7.el7.x86_64
参照
いいえ公共の返信「プラスグループは、」クリア交換基にあなたを取りません
私のパブリック番号「Linuxのクラウド・コンピューティング・ネットワーク」(上記のidは:cloud_dev) 、インナー数10T書籍やビデオリソース、舞台裏の返信「1024」は受け取りを含むが、Linuxに限定されるものではなく、コンテンツを共有するには、ネットワーキング、クラウドコンピューティング、仮想化、コンテナの内容はドッカー、OpenStackは、Kubernetes、ツールは、SDN、OVS、DPDK、ゴーやPython、C / C ++ プログラミング技術、我々は注意を歓迎します。