GDBデバッグ手法

GDBデバッグ手法


1?gdbでのデバッグ

デバッガ
エラー(バグ)が表示されますを実行しているとき、我々はプログラムをデバッグする必要があり、特定すると、アドレスエラー(デバッグ)
リファレンス:(デバッガ以下VC法を)「ステッピング」

デバッグツールは2つに分かれて:
(1) 单步调试デバッガを使用して、ブレークポイントが観測変数とメモリた結合します。
(2) 打印调试分析のようなキー情報出力機能のprintf

GDBデバッグ
LinuxでのGDBのコマンドラインでデバッグシングルステップ
準備:でこのステップをコンパイル追加、选项‐g
G ++ -g main.cppに-oのHelloWorld
または
%の.o:%の.CPP
[タブ] G ++ -c -g-MMD $ < -o $ @

クラス制御コマンド
デバッグプロセスを操作するためのコマンドを使用してインターフェイスGDBに。gdb ./helloworld 进入gdb界面
B(ブレーク):ブレークポイントの追加
プログラムを実行し再起動:R(実行)
N(次の):次
のC(継続):プログラムは次のブレークポイントまで実行し続け、プログラムまたは実行の最後
のq(終了)を:終了プログラム・インターフェース
(注:完全な名前が唯一のB入力することができ、休憩を入力することができます)

ブレークポイントを追加します。
メイン(プラス関数名)B
12(ファイル名+行番号):main.cppに、B
12、B(現在のファイルの行数)
オブジェクトを作成します::(名+クラスのメンバ関数)B
ブレークポイント情報を表示ブレーク
削除ブレークポイント・デル・ブレイク2(第2の背後にあります)

次のステップに次
のn次のステップに
N 3つの行う次の3つのステップ

可変表示/メモリ
P(プリント)式の表示値
PA
p a+b
P(*オブジェクト)P1-> A
関数呼び出し表示のような、より特定の用途、
P( "%のD"、 ' A')

可変表示/メモリ
DISP(ディスプレイ)モニタ変数(各ステップが実行され表示されている)、VCに見て等価

表示メモリ値x
x/16xb buf
請求
16:16単位は
×:進数表示(xdufs ...)
B:1バイト単位(任意bhwg)
バイト、ハーフワード、ワード、ジャイアント

ビューヘルプ
ヘルプX-
ヘルプ情報
サブコマンドのヘルプを表示することができます

概要:
1、GDBデバッグの準備
2、制御コマンドクラス
3、クラスのコマンドを表示

?2?間違いやメモリダンプ

セグメントエラーセグメントフォルト
でのLinux、プログラムが不正なポインタ操作、プログラムがクラッシュし、示唆「セグメント違反」した場合

例えば、ヌル・ポインタ・アクセス、野生ポインタアクセス、クロスボーダー・アクセスのアレイ。
P = NULL * INT;
* P = 1;
安全なポインタ
エラー(誤り、コアダンプ)

セグメンテーションフォールトが位置
このエラーが簡単に再現することであるならば、1を、GDB使用
HelloWorldのgdbの
エラーが発生したプロンプト区間
信号SIGSEGV、セグメンテーションフォールト受信したプログラムを。
main.cppにAT試験における0x0804844a(P-= 0x0の):5
5 * P = 12;この時点でプログラムが異常終了しました

(バックトレース)BTスタック情報は、時間のエラーを表示するには

メモリダンプ
第二には、このエラーは容易に再現されていない
セグメントエラーが発生したときにプログラムが一年中実行し、知らない、プログラムが予期せず終了します。
あなたは、ビューセグメントエラーの位置を復元するために、「メモリダンプ」手段を使用することができます発生しました。

メモリーダンプ

  1. Runコマンドでのプログラムの実行シェル(ターミナル)で
    のulimit -cアンリミテッド
    (注:閉殻を再起動した後、いったん再実行されるように)

  2. プログラムを実行して
    ブロックエラーがダンプ(ダンプ)エラーがコアに発生すると同時に、プログラムが終了したときに発生する。*ファイル。

  3. GDBはエラーコードセグメント位置で起こっているかを確認する
    GDB HelloWorldのコア。***

概要:
1、セグメンテーションフォールト
2、メモリダンプ

3?Gdbのデバッグサプリメント

概要
(1)種類のプログラムの何がデバッグされている?
(2)どのような状況をGDBでデバッグするために?場所は何ではないのですか?

プログラム内のデバッグ情報を
プログラムがコンパイルされる-gオプションを使用して、プログラムをデバッグすることができたときに
-gオプションを指定してコンパイルするとき、実際には、コンパイラがされる“调试信息”ターゲットプログラムに追加され、そのため、ターゲットプログラムの量が大幅に変更されます大規模な。
ターゲットプログラム出力の音量の比較:
G ++ main.cppに-o HelloWorldの-g
G ++ main.cppに-oのHelloWorld

だから、平均「デバッグ情報」でプログラムかどうかを確認する方法?
第一の方法:(直視)
objdumpの-h HelloWorldの
(注:GCC G ++ GDB objdumpのNM AR LD ...は、 ツールのセットである)
セグメントが.DEBUGの束で開始する
第二の方法:GDB HelloWorldの
デバッグ情報れる場合ヒント:
HelloWorldのからシンボルを読む...(no debugging symbols found)... DONE。

デバッグ情報には、どのような事を記録しますか?
-少なくとも、ソースファイルと行番号情報を記録

GDBの使用シナリオ
可能な用途:
-ユニットテスト(ショートコードは、単純な機能を備えています)
-セクションの位置決めの誤りが
適用場面ではない:
-大規模なプログラム、
-マルチスレッドで使用される特に手続き
-ステッピング問題は、再生の場合にのみ、正常な動作を再現することができないとき
(我们使用打印调试)

概要:
1、原則デバッグGDB
2を、GDBデバッグおよび印刷アプリケーション

学習リソース 《C语言/C++学习指南》Linux开发篇

リリース6元記事 ウォンの賞賛0 ビュー67

おすすめ

転載: blog.csdn.net/qq_46165724/article/details/104761162