WEB开发网
开发学院软件开发Shell 如何在 Linux 下调试动态链接库 阅读

如何在 Linux 下调试动态链接库

 2009-06-30 03:44:00 来源:WEB开发网   
核心提示: 这样我们就准备好了动态链接库了,下面我们编写一个应用程序来调用此动态链接库,如何在 Linux 下调试动态链接库(2),源代码如下:[Copy to clipboard]CODE:/关于本文档*filename: pk.cpp*purpose: 一个调用动态链接库的示例*tided by: zhoulifa(zhou

这样我们就准备好了动态链接库了,下面我们编写一个应用程序来调用此动态链接库,源代码如下:

[Copy to clipboard]
CODE:
/************关于本文档********************************************
*filename: pk.cpp
*purpose: 一个调用动态链接库的示例
*tided by: zhoulifa(zhoulifa@163.com) 周立发 (http://zhoulifa.9999mb.com)
Linux 爱好者 Linux 知识传播者 SOHO 族 开发者 最擅长 C 语言
*date time:2006-11-15 21:11:54
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
* 但请遵循 GPL
*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
*感谢 vcclass@hotmail.com 提供原始代码,

我在他的基础上整理了此文
*********************************************************************/
#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\n",a,b,c,d);

   return 0;

}

编译此程序用下列命令,如果已经把上面生成的 libggg.so 放到了库文件搜索路径指定的文件目录,比如 /lib 或 /usr/lib 之类的,就用下面这条命令:

QUOTE:
g++ pk.cpp -o app -Wall -g -lggg

否则就用下面这条命令:

QUOTE:
g++ pk.cpp -o app -Wall -g -lggg -L`pwd`

下面我们就开始调试上面命令生成的 app 程序吧。如果已经把上面生成的 libggg.so 放到了库文件搜索路径指定的文件目录,比如 /lib或 /usr/lib 之类的,调试就顺利完成,如下

QUOTE:
linux#gdb">zhoulifa@linux#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 theconditions.


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\n", a);

Tags:如何 Linux 调试

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接