GDBのヒント(1) - 概要と開始

GDBの概要

GDBは、強力なUNIX GNUオープンソースリリースの下でのデバッグツールです。おそらく、あなたはなどVC、BCB IDEをデバッグするように、グラフィカルなインターフェイスの種類を好むが、あなたはUNIXプラットフォームでソフトウェアを実行している場合、あなたは、より多くのVCよりBCBグラフィカルデバッガをGDBデバッガツールがありますパワフル。いわゆる「ディレクターインチは、短い足を持っている」真実です。

一般的には、GDBを助け、あなたは、次の4つの分野の主な機能を実行します。

    1、あなたのプログラムを起動し、あなたのカスタムプログラムの要件に応じて、任意のことができます。
    2、プログラムビーイングは、指定したブレークポイントのトーンセットで停止デバッグさせることができます。(ブレークポイントが条件式することができます)
    3プログラムが停止しているとき、あなたはプログラムの中で起こったかどうか確認することができます。
    図4は、動的なプログラムの実行環境を変更します。

それはそうの上、GDBデバッグツールと一般的な無の異なるが、基本的にこれらの機能を実現するが、詳細には、あなたがこの強力なGDBデバッグツールを見つけるだろう、我々はより多くのグラフィカルなデバッグツールに慣れているが、そこにあることもできるから、デバッグ時にコマンドラインツールを完了することはできませんが、それは、グラフィカルなツールとしての機能を有します。私たちはそれはそう持ってみましょう。

使用GDB

一般的なGDBデバッガでは、主にC / C ++プログラムです。C C ++プログラムをデバッグするには/、最初のコンパイル時に、我々は、実行可能ファイルにデバッグ情報を配置する必要があります。コンパイラ(CC / gccを/グラム++)それを行うことができます-gパラメータです。以下のような:

    > CC -gのhello.c -oこんにちは
    > G ++ -g HELLO.CPP -oハロー

ノー-g場合、あなたは、実行時のメモリアドレスに置き換えされているすべてのそれらの変数名を、Functionプロシージャの名前は表示されません。あなたは-gデバッグ情報を使用する場合は追加し、成功した後、オブジェクトコード、彼のデバッグにgdbを使用する方法で見てみましょうがコンパイルされています。

GDBを起動する方法は、次のとおりです。

    1は、gdbの<プログラム>
       プログラムは、通常コースのカタログに、あなたの実行可能ファイルです。

    2、GDB <プログラム>コア
       で実行されるプログラムとコアファイルをデバッグするGDBと、コアファイルがコアダンプ後の不正なプログラムの実行により生成されます。

    3、GDB <プログラム> <PID >
       プログラムはサービスプログラムである場合は、サービスプログラムのプロセスIDが実行されている指定することができます。gdbが自動的に添付し、そして彼を試運転します。検索プログラムは、PATH環境変数に取得する必要があります。

GDBを起動すると、GDBは、スタートスイッチのいくつかは、スイッチはgdbで詳細ビューを-helpも追加することができます。下に私はより一般的に使用されるパラメータのいくつかを言及しました:

  • -symbols <ファイル>
  • -s <ファイル>

シンボルテーブルが指定されたファイルから読み込まれます。

  • -theファイル

指定されたファイルからシンボル・テーブル情報を読み込み、実行可能ファイルとで彼を置きます。

  • -core <ファイル>
  • -c <ファイル>

コアコアダンプファイルのデバッグ時に。

  • -directory <ディレクトリ>
  • -d <ディレクトリ>

ソースファイルの検索パスに参加。デフォルトの検索パスはPATH環境変数で定義されたパスです。

試運転

出典:test.cの

#include <stdio.h>

int func(int n)
{
        int sum=0,i;
        for(i=0; i<n; i++)
        {
                sum+=i;
        }
        return sum;
}


main()
{
        int i;
        long result = 0;
        for(i=1; i<=100; i++)
        {
                result += i;
        }

       printf("result[1-100] = %d /n", result );
       printf("result[1-250] = %d /n", func(250) );
}

编译生成执行文件:(Linux下)
    hchen/test> cc -g tst.c -o tst

使用GDB调试:

hchen/test> gdb tst  <---------- 启动GDB
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-suse-linux"...
(gdb) l     <-------------------- l命令相当于list,从第一行开始例出原码。
1        #include <stdio.h>
2
3        int func(int n)
4        {
5                int sum=0,i;
6                for(i=0; i<n; i++)
7                {
8                        sum+=i;
9                }
10               return sum;
(gdb)       <-------------------- 直接回车表示,重复上一次命令
11       }
12
13
14       main()
15       {
16               int i;
17               long result = 0;
18               for(i=1; i<=100; i++)
19               {
20                       result += i;   
(gdb) break 16    <-------------------- 设置断点,在源程序第16行处。
Breakpoint 1 at 0x8048496: file tst.c, line 16.
(gdb) break func  <-------------------- 设置断点,在函数func()入口处。
Breakpoint 2 at 0x8048456: file tst.c, line 5.
(gdb) info break  <-------------------- 查看断点信息。
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x08048496 in main at tst.c:16
2   breakpoint     keep y   0x08048456 in func at tst.c:5
(gdb) r           <--------------------- 运行程序,run命令简写
Starting program: /home/hchen/test/tst

Breakpoint 1, main () at tst.c:17    <---------- 在断点处停住。
17               long result = 0;
(gdb) n          <--------------------- 单条语句执行,next命令简写。
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) n
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) c          <--------------------- 继续运行程序,continue命令简写。
Continuing.
result[1-100] = 5050       <----------程序输出。

Breakpoint 2, func (n=250) at tst.c:5
5                int sum=0,i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p i        <--------------------- 打印变量i的值,print命令简写。
$1 = 134513808
(gdb) n
8                        sum+=i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
8                        sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt        <--------------------- 查看函数堆栈。
#0  func (n=250) at tst.c:5
#1  0x080484e4 in main () at tst.c:24
#2  0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish    <--------------------- 退出函数。
Run till exit from #0  func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24              printf("result[1-250] = %d /n", func(250) );
Value returned is $6 = 31375
(gdb) c     <--------------------- 继续运行。
Continuing.
result[1-250] = 31375    <----------程序输出。

Program exited with code 027. <--------程序退出,调试结束。
(gdb) q     <--------------------- 退出gdb。
hchen/test>

 

オリジナルリンク:https://blog.csdn.net/haoel/article/details/2879

公開された175元の記事 ウォンの賞賛262 ビュー700 000 +

おすすめ

転載: blog.csdn.net/li_wen01/article/details/105221599