36.Linuxアプリケーションのデバッグ - GDBとgdbserverを使用

1.gdbと原則をデバッグgdbserverを

  GDBのLinux仮想マシンでは、SETPなどを実行し、ブレークポイントの設定など、gdbserverをコマンドで開発ボードに送信する、コマンドを受け取った後、それを達成するために、適切なアクションgdbserverを開発ボードを行うためのアプリケーションを実行しますデバッグ機能

  そして、GDBは、学校が勝利であり、そしてどこGDB Linuxではこれはちょうど前に、のような、学校の前に裸のボードのデバッグ

1.1同様に、彼らは、デバッグ情報を含むファイルをコンパイルする必要があります。

  Makefileから腕のlinux-gccが-g、来る-g:それはGDBデバッグ情報が含まれているコンパイルされたファイルを表し

1.2は、なぜあなたはデバッグファイルの情報をコンパイルする必要がありますか?

  このような変数aのアプリケーション開発ボードの読書のように:

  アプリケーションでファイルをコンパイルしてデバッグ情報を最初のGDBは、格納された位置変数のアドレスを検索します

  そして、読み出しアドレスに、gdbserverを内のボードにアドレスを送信

GDBとgdbserverのをインストールします。2.

  http://ftp.gnu.org/gnu/gdb/:ダウンロードGDB-7.4に公式サイトを入力する最初の

GDB 2.1は、仮想マシンにインストールされています。

# tar xjf gdb-7.4.tar.bz2                  //解压

# cd gdb-7.4/                              //进入gdb-7.4目录

#./configure --target=arm-linux         
              //GDB需要在pc本机里运行,并调试开发板里的应用程序,所以--target设为arm-linux

#make                                      //编译

#mkdir    tmp                            

#make install prefix=$PWD/tmp              //安装到./tmp目录下

sudo cp tmp/bin/arm-linux-gdb  /bin/       //复制到/bin目录下

/bin/arm-linux-gdb  -v                     //-v: 确定一下gdb的版本VID,是否是7.4

2.2インストールGDBSERVER開発ボード:

cd gdb/gdbserver/                                   //在gdb-7.4目录下输入

./configure --target=arm-linux --host=arm-linux              //设GDBServer的工作环境

make             //编译

  次のエラーが発生しました:
ここに画像を挿入説明
  Linuxベースアームlow.cを指し、いかなる定義がPTRACE_GETSIGINFOが見つかりません

2.3解像度:

  1)

#echo $PATH     //来查看PATH环境变量
找到编译器gcc位于/work/tools/gcc-3.4.5-glibc-2.3.6/bin

  2)

#cd /work/tools/gcc-3.4.5-glibc-2.3.6/    
# grep "PTRACE_GETSIGINFO"  *  -nR

  ルートディレクトリの下GCC、検索が中のlinux / ptrace.hで定義されています
ここに画像を挿入説明
  3)

#vi linux-arm-low.c

  添加ます。#define PTRACE_GETSIGINFO 0x4202

  4)最後に再メイク、コマンドファイルgdbserverのを生成

  そして、我々の開発ボード/ビンのルートにgdbserverをコマンドファイルには、使用することができます

cp  gdbserver  /nfs_root/bin/          //nfs_root:开发板的nfs系统根目录

3.次のように試験手順は(test_debug.c)でした

#include <stdio.h>

void  C(int *p)
{
   *p = 0x12;
}

void  B(int *p)
{
  C(p);
}

void  A(int *p)
{
  B(p);
}

void  A2(int *p)
{
  C(p);
}

int  main(int argc, char **argv)
{
  int a;
  int *p = NULL;
  A2(&a);  // A2 > C
  printf("a = 0x%x\n", a);
  A(p);    // A > B > C
  return 0;
}

  > C()、その後、0x12をに割り当てられた - どこA2(&)A2()を呼び出します。

  > B( - ) - A§はA()を呼び出し> C()pがNULLポインタであるため、エラーがここで起こります。

  次に、我々は、一例として、このアプリケーションを持っています。

4.コンパイル

#arm-linux-gcc -g -o test_debug test_debug.c   //-g:附带调试信息

5.デバッグtest_debug.c

  開発ボードには:

  まず、ローカルサーバーを確立し、同様にあなたがテストしたいファイルとしてgdbserverを行う必要があります。

#gdbserver 192.168.2.107:2345 ./test_debug
//192.168.2.107:本地IP地址
//2345:端口号,用来让gdb来连接用的
//./test_debug:要测试的哪个文件

  仮想マシンの場合:

#/bin/arm-linux-gdb   ./test_debug    // 启动gdb,指定调试文件为test_debug

#target remote  192.168.2.107:2345    //与gdbserver建立连接

5.1接続に成功し、その後、gdbデバッガコマンドを使用します

  次のように一般的なコマンドは次のとおりです。

  リットル

  すべてのソースコードをリスト

ブレーク[ファイル]:[行]

  次のようなブレークポイント、

break test_debug.c:21     //在test_debug.c文件的第21行处打断点

  情報BR

ビューのブレークポイント

  infoファイル

  リスト現在のファイル、共有ライブラリ。

  削除A

  下に示すように、ブレークポイントの一部を削除し
ここに画像を挿入説明
  、C

  プログラムの実行を開始します

  ステップ

  シングルステップ実行

  

  シングルステップ、および異なるステップは、例えば次のとおりです、関数にステップする関数呼び出し、次の下に直接実行は、現在の行があります

  印刷します

  変数の値を印刷

  終了する

  GDBを終了します

6.あなたはまた、GDB +コアダンプによってtest_debug.cをデバッグすることができます

  エラーを実行すると、コアダンプ、供給GDBデバッグでコアへの預金の健康にコアファイルやプログラムを生成します。

すべての6.1まず、ulimitのことで、リソースのコアダンプのサイズを確認するには

  ulimitコマンド(ユーザ制限)は、主に各プロセスのリソースユーザを制限するために使用されます。

  開発ボードに入力します。
ここに画像を挿入説明
  上記のように、見ることができコアダンプリソースサイズは、実行エラーが、コアファイルを生成しないとき、あること、0であります

コアファイルの設定6.2

  無制限のリソースへの設定コアファイルサイズ、次のコマンドを入力します。

ulimit -c unlimited
 //-c:对应coredump

6.3は、コアファイルを生成します

  実行:

#./test_debug

  間違いが発生し、コア・ファイルは、以下のように示します:
ここに画像を挿入説明

6.4 VMエントリー

  コアが実行し、コピーされました:

#/bin/arm-linux-gdb ./test_debug ./core

  そして、BTを入力して、あなたは呼び出し関係を表示することができます。
ここに画像を挿入説明

公開された84元の記事 ウォンの賞賛2 ビュー2218

おすすめ

転載: blog.csdn.net/qq_16933601/article/details/104328423