linuxでcデバッグ

4938 ワード

デバッグはプログラマー一人一人が直面する問題です.プログラマーのデバッグ効率を向上させ、プログラム中の問題をより速く位置決めし、プログラム開発の進度を速めるには、みんなが直面している問題である.Windowsユーザーは、VCを使用して、-)ブレークポイントを設定したり、単一ステップで追跡したりするグラフィックインタフェースを提供し、デバッグを直感的に容易にすることができます.しかし、Linuxユーザーは退屈になるかもしれませんO:-):まさか私たちのLinuxプログラマーは元のデバッグ方法を使って、コードにprintf情報を加えるしかありませんか?まさかLinuxの下で良いC言語のデバッグツールがありませんか?もちろん違います.GNUはとっくにC言語コンパイラ(Gcc)とデバッグツール(Gdb)を組織開発した.Gdbはグラフィック化された友好的なインタフェースはないが、マイクロソフトのVCツールに匹敵する強力な機能であり、Linuxプログラマーに福音をもたらした.Gdbの使用手順を簡単な例で説明します.
サンプルファイルdemo.cのソースコードは以下の通りである.
#include <stdio.h>

int sum(int, int);

    int
main()
{
    int result;
    int a = 1, b = 2;
    result = sum(a, b);
    printf("%d + %d = %d
", a, b, result); return 0; } int sum(int a, int b) { return a + b; }

ソースファイルをコンパイルし、実行可能ファイルを生成
$ gcc -g -Wall -o demo demo.c
このプログラムにはエラーはありませんが、デバッグが完全に正しいプログラムはGdbの使用プロセスをより理解することができます.次にGdbを起動するデバッグを行う.
注意:
  • Gdbがデバッグを行うのは、".c"ソースファイルではなく実行可能ファイルであるため、Gdbでデバッグを行うには、Gccコンパイルにより実行可能ファイルを生成する必要がある.
  • は、コンパイルする実行可能コードにデバッグ情報が含まれないように、必ずオプション「-g」を付けなければならない.そうしないと、Gdbは実行可能ファイルをロードできない.
  • は、最適化後に実行可能ファイル内のシンボルテーブル情報が削除するので、実行可能ファイルとソースファイルとの関連付けが見つからず、デバッグもできないため、-O 2オプションを使用して実行可能ファイルを最適化することはできない.

  • (1)Gdbの起動
    $ gdb demo
    GNU gdb (GDB) 7.0-debian
    Copyright (C) 2009 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-linux-gnu".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>...
    Reading symbols from /home/wangsheng/tmp/demo/gdb/demo...done.
    から分かるように、Gdbの起動画面では、Gdbのバージョン番号、使用するライブラリファイルなどのヘッダ情報が指摘する、続いて「(gdb)」から始まるコマンドラインインタフェースに入る.
    (2)表示元ファイルGdbに「l」(listの略)と入力すると、以下のようにロードされたファイルが表示されます.
    (gdb) l
    1       #include
    2
    3       int sum(int, int);
    4
    5           int
    6       main()
    7       {
    8           int result;
    9           int a = 1, b = 2;
    10          result = sum(a, b);
    (gdb) l
    11          printf("%d + %d = %d
    ", a, b, result); 12 return 0; 13 } 14 15 int 16 sum(int a, int b) 17 { 18 return a + b; 19 } (gdb) l Line number 20 out of range; demo.c has 19 lines.
    から分かるように、Gdbにリストされたソースコードには、対応する行番号が明確に与えられているので、コードの位置決めを大幅に容易にすることができる.
    (3)ブレークポイントの設定ブレークポイントはデバッグプログラムにおいて非常に重要な手段であり、プログラムを一定の位置に一時停止することができる.したがって、この位置で変数の値やスタックの状況などを容易に見ることができる、コードの問題点を特定することができる.Gdbでのブレークポイントの設定は非常に簡単で、「b」の後に対応する行番号を加えるだけでよい(これは最も一般的な方法である).次のようになります.
    (gdb) b 9
    Breakpoint 2 at 0x4004f4: file demo.c, line 9.

    注意:このブレークポイントの役割は、プログラムが9行目に実行されたときに一時停止することです(8行目の実行が完了し、9行目が実行されません)
    (4)ブレークポイント情報の表示
    (gdb) info b
    Num     Type           Disp Enb Address            What
    2       breakpoint     keep y   0x00000000004004f4 in main at demo.c:9

    (5)実行コードは次のように実行することができ、Gdbはデフォルトで最初の行からコードを実行し、「r」(runの略)を入力すればよい.プログラムで指定する行から実行を開始するには、rの後ろに行番号を付ける.
    (gdb) r
    Starting program: /home/wangsheng/tmp/demo/gdb/demo
    
    Breakpoint 2, main () at demo.c:9
    9           int a = 1, b = 2;
    
    は、プログラムがブレークポイントで停止するのを見ることができる.
    (6)変数値の表示p(printの略)+変数名を入力すると、その変数の値を表示できます.
    (gdb) p a
    $1 = 1
    (gdb) p b
    $2 = 2
    (gdb) p result
    $3 = 32767

    注意:ここでresultがわけのわからない値であるのは、resultが初期化されていないことを宣言し、その値が固定されていないためです.
    (7)単一ステップ実行単一ステップ実行は、n(nextの略)またはs(stepの略)を用いることができるが、これらの違いは、関数呼び出しがある場合、sはその関数に入り、nはしないことである.したがって、sはVC等のツールにおける「step in」に類似する、nはVC等のツールにおける「step over」に類似する.nコマンドを使用すると、次のように表示されます.
    (gdb) n
    10          result = sum(a, b);
    
    次はsコマンドを使用してsum関数にトレースします.
    (gdb) s
    sum (a=1, b=2) at demo.c:18
    18          return a + b;
    

    sコマンドを実行するときにsum関数の内部に入ることがわかる、nコマンドを使用すると、関数の呼び出し部分(8)をスキップして復元プログラムが実行する変数値やスタックを表示した後、コマンドc(continue)を使用してプログラムの正常な実行を復元することができる.このとき、残りの未実行プログラムの実行が完了する、残りのプログラムの実行結果が表示される.
    (gdb) c
    Continuing.
    1 + 2 = 3
    
    Program exited normally.
    から分かるように、プログラムは実行後に終了し、その後プログラムは「停止状態」にある.
    説明:Gdbでは、プログラムの実行状態は「実行」、「一時停止」、「停止」の3種類がある.「一時停止」状態は、プログラムがブレークポイントまたは観察ポイントに遭遇し、プログラムが一時的に停止し、このとき関数のアドレス、関数パラメータ、関数内のローカル変数は「スタック(Stack)」に押し込まれます.この状態では関数の変数値など様々な属性を表示できますが、関数が「停止」状態になると「スタック」は自動的に取り消され、Gdbに関するより多くのコマンドを表示することができません.Gdbを有効にした後、helpコマンドを入力して表示することができます.
    Related Posts