gdbデバッグダイナミックリンクライブラリ

6046 ワード

【原文の住所】http://www.microsuncn.com/index.php?title=%E7%94%A8gdb%E8%B0%83%E8%AF%95%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93
Linuxではgdbでアプリケーションをデバッグできます.もちろん、gccでプログラムをコンパイルするときは-gパラメータを追加することが前提です.この文章でダイナミックリンクライブラリのデバッグについて検討します.まず、このようなダイナミックリンクライブラリを用意すると仮定します.参照:ライブラリ名:ggダイナミックリンクライブラリファイル名:libgg.soヘッダファイル:get.hは、このような2つの関数を提供してインターフェースを呼び出す:
   int get ();

   int set (int a);

このようなダイナミックリンクライブラリを生成するには、まずこのようなヘッダファイルを作成します.
/************     ********************************************

*filename: get.h

*********************************************************************/

int get ();

int set (int a);

動的リンクライブラリを生成するソースファイルを準備します.
/************     ********************************************

*filename:  get.cpp

*********************************************************************/

#include <stdio.h>

#include "get.h"



static int x=0;

int get ()

{

        printf ("get x=%d
", x); return x; } int set (int a) { printf ("set a=%d
", a); x = a; return x; }
その後GNUのC/C++コンパイラを使って動的リンクライブラリを作成し、コンパイルコマンドは以下の通りです.
g++ get.cpp -shared -g -DDEBUG -o libggg.so

g++ get.cpp -shared -g -fPIC -DDEBUG -o libggg.so (64   )

このように、ダイナミックリンクライブラリを準備しました.以下、このダイナミックリンクライブラリを呼び出すためのアプリケーションを作成します.ソースコードは以下の通りです.
/************     ********************************************

*filename: pk.cpp

*********************************************************************/

#include <stdio.h>

#include "get.h"

int main (int argc, char** argv)

{

        int a = 100;

        int b = get ();

        int c = set (a);

        int d = get ();



        printf ("a=%d,b=%d,c=%d,d=%d
",a,b,c,d); return 0; }
このプログラムをコンパイルするには以下のコマンドを使います.上で生成したlibgg.soをライブラリファイルの検索パスで指定されたファイルディレクトリに入れました.例えば/libや/usr/libなど、次のコマンドを使います.
g++ pk.cpp -o app -Wall -g -lggg

さもないと次のコマンドを使います.
g++ pk.cpp -o app -Wall -g -lggg -L`pwd`

上の命令で作成したアプリのデバッグを始めましょう.上で生成されたlibgg.soをライブラリファイル検索パスで指定されたファイルディレクトリに入れておけば、例えば/libや/usr/libなどのようにデバッグがスムーズに完了します.
#gdb ./app

GNU gdb 6.4-debian

Copyright 2005 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 "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".



(gdb) b main    /*        main       */

Breakpoint 1 at 0x804853c: file pk.cpp, line 7.

(gdb) b set      /*        set       */

Function "set" not defined.

Make breakpoint pending on future shared library load? (y or [n]) y /*        y                   */

Breakpoint 2 (set) pending.

(gdb) run /*          ,          */

Starting program: /data/example/c/app

Breakpoint 3 at 0xb7f665f8: file get.cpp, line 11.

Pending breakpoint "set" resolved



Breakpoint 1, main (argc=1, argv=0xbf990504) at pk.cpp:7

7               int a = 100;

(gdb) n     /*              */

8               int b = get ();

(gdb) n      /*                     */

get x=0

9               int c = set (a);

(gdb) n



Breakpoint 3, set (a=100) at get.cpp:11

11              printf ("set a=%d
", a); (gdb) list /* , */ 6 printf ("get x=%d
", x); 7 return x; 8 } 9 int set (int a) 10 { 11 printf ("set a=%d
", a); 12 x = a; 13 return x; 14 } (gdb) n set a=100 12 x = a; (gdb) n 13 return x; (gdb) n 14 } (gdb) n main (argc=1, argv=0xbf990504) at pk.cpp:10 10 int d = get (); (gdb) n get x=100 11 printf ("a=%d,b=%d,c=%d,d=%d
",a,b,c,d); (gdb) n a=100,b=0,c=100,d=100 12 return 0; (gdb) c Continuing. Program exited normally. (gdb) quit /* */ , /lib , , : # gdb ./app GNU gdb 6.4-debian Copyright 2005 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 "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1". (gdb) b main Breakpoint 1 at 0x804853c: file pk.cpp, line 7. (gdb) b set Function "set" not defined. Make breakpoint pending on future shared library load? (y or [n]) y Breakpoint 2 (set) pending. (gdb) run /* , */ Starting program: /data/example/c/app /data/example/c/app: error while loading shared libraries: libggg.so: cannot open shared object file: No such file or directory Program exited with code 0177. (gdb) quit
デバッグに失敗した原因はgdbがlibgg.soを見つけられないため、以下の方法で解決できます.
1)       LD_LIBRARY_PATH 

2)   :ldconfig YOUR_LIB_PATH

3)  /etc/ld.so.conf        。    :ldconfig



  3          ,     gdb        。

追加:
1、          ServerName,    worker.so

2、  gdb  ServerName,  B      (  worker.cpp,worker.cpp ServerName        )     ,        break worker.cpp:123



                     :



  gdb     LD_PRELOAD,             load  

          ,          LD_LIBRARY_PATH   



      lib     ,  /usr/lib 



b main, r,           ,