Codeblocks GDBデバッガの設定と使用

6728 ワード

Codeblocks GDBデバッガの設定と使用
  • MDアーカイブ時間:2/4/2016 22:29:17 AM by Jimbowhy
  • CSDN公開アドレス:http://blog.csdn.net/WinsenJiansbomber/article/details/50636911

  • GDB概要
    GDBフルネームはGNU Project Debuggerで、GNUエンジニアリング専用デバッガです.現在の最新バージョンは7.10.1で、公式サイトで本システムをダウンロードできるのはTDM-GCC 4.9.2に付属の7.6.1バージョンです.GDBを介して、Ada、C、C++、Objective-C、Pascalなどの言語のプログラムデバッグを実現できます.デバッグ方式はローカルでデバッグを実行することができ、リモートでデバッグを実行することも同様である.公式サイトの簡明な機能説明は以下の通りである.
  • デバッグ対象プログラムを実行し、プログラムの動作に影響を与えることができる.
  • は、条件割り込みを設定してプログラムを指定された条件で停止させることができる.
  • プログラムの中止時に原因を検査するために使用することができる.
  • プログラムを変更して、虫除去またはデバッグを試みることができます.

  • 使用マニュアル
    GDB変調プログラムを実行すると、コンソールインタフェースにいくつかの状態情報が表示され、複雑なGUIを使わず、WinDBGよりも機能が弱くありません.
    >gdb
    GNU gdb (GDB) 7.6.1
    Copyright (C) 2013 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later 
    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 "mingw32".
    For bug reporting instructions, please see:
    .
    

    GDBに入ると、execコマンドを使用してデバッグ対象のターゲットプログラムをロードし、fileコマンドを使用してデバッグシンボル情報をロードします.
    (gdb) exec overload.exe
    (gdb) file overloadApp.o
    Reading symbols from C:\c\src\overload\Debug\overloadApp.o...done.
    

    もちろん、これはGDBを実行する前にコマンドで実行できます.
    gdb overload
    

    デバッグ情報があれば、デバッグに直接関連する操作を使用できます.まず、リストコマンドlを使用して、指定した行番号のソースコードの内容をリストできます.
    (gdb) l
    1       /***************************************************************
    2        * Name:      overloadMain.cpp
    3        * Purpose:   Code for Application Frame
    4        * Author:    Jimbo ([email protected])
    5        * Created:   2016-01-31
    6        * Copyright: Jimbo (www.here.com)
    7        * License:
    8        **************************************************************/
    9
    10      #include "overloadMain.h"
    

    リストコマンドはデフォルトで上下5行表示され、setコマンドでlistsizeという値を変更することができ、setはレジスタの値を変更することもできます.
    set listsize count
    set 
    

    通常、呼び出しは、指定されたコード行、関数、またはクラスメンバーにブレークポイントを設定する目的で開発されています.そのため、ブレークポイントコマンドには、ネーミングスペース接頭辞と割り込みの条件設定をサポートする複数のフォーマットがあります.
    (gdb) b 84
    Breakpoint 1 at 0x42d: file C:\c\src\overload\overloadMain.cpp, line 84.
    (gdb) b overloadMain.cpp:26
    Breakpoint 2 at 0x0: file C:\c\src\overload\overloadMain.cpp, line 26.
    (gdb) b overloadFrame::overloadFrame
    Breakpoint 3 at 0xdc: file C:\c\src\overload\overloadMain.cpp, line 68.
    (gdb) b overloadMain.cpp:wxbuildinfo
    Breakpoint 4 at 0x0: file C:\c\src\overload\overloadMain.cpp, line 26.
    

    条件付きブレークポイント設定のフォーマット参照:
    b file.cpp:26 if var == value
    

    設定したブレークポイントについてはinfo bコマンドを使用してチェックしたり、clearを介してブレークポイントをクリアしたりすることができます.
    (gdb) info b
    (gdb) clear 26
    (gdb) clear wxbuildinfo
    

    また、観測点を設定してプログラム割り込みを実現することもでき、観測点がwatchで指定された式が変化すると割り込み、rwatchで指定された式が読み出されたときに割り込み、awwatchで指定された式が付与されたり、書き込み動作があったりしたときに割り込むこともできます.infoはマルチコマンドで、設定された観測点情報を表示できます.
    info watchpoints
    

    デバッグに進む
    プログラムの実行を開始すると、実行プロセスを制御するコマンドのセットがあります.runはプログラムを起動し、nextは関数をスキップし、stepは関数に入り、untilはループを終了し、finishは関数呼び出しを完了し、continueは次の中断まで断続的に実行します.GDBはまた、コードを分解するために単一のマシン命令を実行する2つのコマンド、stepiとnextiを提供し、単一のマシン命令を単一のステップで追跡します.コマンドprintは、情報を表示するだけでなく、プログラムのデータを変更することもできます.jumpコマンドは、実行プロセスを変更したり、callを使用して強制的に実行したりすることができます.
    変調状態に入ると、ハードウェアの内部状態を別のコマンドのセットで表示できます.breacktraceはスタック情報を表示し、frameはスタック層を選択しinfo frameコマンドと組み合わせてスタック層の詳細を表示します.たとえば、スタックの内容を表示するには、スタック層番号が小さいほど、前に実行した制御点に近づきます.upおよびdownは、スタックレイヤを上下に移動し、オフセット値を指定するために使用されます.これらには、対応するsilent方式、select-frame、up-silently、down-silentlyがあります.これにより、スタックレイヤの選択時にコンソールに余分な情報を表示しないようにできます.またreturnは、スタック内で戻る動作を実行するために使用することもできます.
    レジスタの表示はinfoコマンドによって実現され、setコマンドと組み合わせてレジスタの読み書きを実現することができる.
    info register
    set $eax=0
    

    以上のコマンドには、breaktraceをbt、registerをregと略記するなど、略記形式があり、使いやすいです.また、リターン機能は、前回の動作を繰り返すために使用できます.デバッグを終了するには、quitコマンドを直接使用します.
    シンボルパスとCodeBlocks設定
    GDBはコードレベルのデバッガとして、ソースコード検索機能も強い.directoryコマンドを使用してコードディレクトリを追加します.ディレクトリを指定しないか、追加したディレクトリを指定しないと、検索パスリストからディレクトリが削除されます.実際には、より強力なディレクトリ検索機能はルールを置き換え、プログラムのコンパイルが完了すると、コードのパスが移動されることを考慮して、ソースコードをどのように見つけることができますか?PATH環境変数を使用しますか?NO,GDBはこんなばかなことはしない.1つの方法は、ソースコードを対応する位置、絶対的または相対的なパスに移動することです.GDBは、次のような問題を解決するためのパス置換規則を提供します.
    dir C:\\wx281\\src
    set substitute-path ../../include C:\\wx281\\include
    set substitute-path ../../src C:\\wx281\\src
    

    この2つのコマンドは、システムにインストールされているwxWidgetsコードをプログラムのデバッグ情報にマッピングするためのもので、GDBは../../includeのようなパス参照を見ると、C:\\wx28\\includeディレクトリの下でソースコードを探します.次のコマンドを使用して、ソースコードの検索パス、置換ルールを表示または変更します.
    dir
    show directories
    show substitute-path
    unset substitute-path [path]
    

    実測ではsubstitute-pathが公式に言ったほど有効ではなく、まったく役に立たず、バージョンに互換性の問題があるかどうか分からないことが分かった.だから私はやはり偶然に取って、プログラムをデバッグする時、よく相対パスを使う情況に出会って、だから、わざわざ偽のサブディレクトリのパスを追加して、このように相対ディレクトリを引用する時ちょうどポイント番号を相殺することができます:
    C:/wx281/src/faked
    

    また、画像などのリソースファイルを読み込む必要がある場合があります.相対パスを使用すると、作業ディレクトリの設定の問題でリソースのロードに失敗する可能性があります.
    Codeblocks GDB调试器设置与使用_第1张图片
    cdコマンドはこの問題を解決します.通常のインタフェース:
    Codeblocks GDB调试器设置与使用_第2张图片
    では、上記の内容はGDBコマンドラインを書く方法です.-argsは、デバッグされたプログラムにパラメータanythingを渡すことを示しています.
    gdb --directory="C:\CodeBlocks\wx281\src;C:\CodeBlocks\wx281\src\fake" 
        -ex="set substitute-path ../../include C:\\CodeBlocks\\wx281\\include" 
        -ex="set substitute-path ../../src C:\\CodeBlocks\\wx281\\src" 
        -args overload.exe anything
    

    GDB機能や使用が明確になってから、CodeBlocksを配置するのはかなり使いやすいです.もちろんGDBの機能は前述の部分だけではなく、公式マニュアルの詳細を参考にすることに興味があります.
    Settings->DebuggerでCodeBlocksデバッガ設定インタフェースを開き、GDBの構成を選択し、Argumentsに以下の内容を入力します.ここではグローバル変数#wx 281を使用してwxWidgets 2.8.12のインストールディレクトリを指し、もう一つの変数$(TARGET_OUTPUT_DIR)はコンパイラが生成した結果の出力ディレクトリを指します.
    --directory=$(#wx281)/src --cd=$(TARGET_OUTPUT_DIR)
    

    リファレンス
    GDB公式ダウンロードGDB使用大全GDB公式ドキュメントWindbgデバッグコマンド詳細