当前位置:  技术问答>linux和unix

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

    来源: 互联网  发布时间:2015-12-30

    本文导语:  大家都知道在 Linux 可以用 gdb 来调试应用程序,当然前提是用 gcc 编译程序时要加上 -g 参数。 我这篇文章里将讨论一下用 gdb 来调试动态链接库的问题。 首先,假设我们准备这样的一个动态链接库: QUOTE:  ...

大家都知道在 Linux 可以用 gdb 来调试应用程序,当然前提是用 gcc 编译程序时要加上 -g 参数。
我这篇文章里将讨论一下用 gdb 来调试动态链接库的问题。
首先,假设我们准备这样的一个动态链接库:

QUOTE: 
库名称是: ggg
动态链接库文件名是: libggg.so
头文件是: get.h
提供这样两个函数调用接口:
int get ();
int set (int a); 


要生成这样一个动态链接库,我们首先编写这样一个头文件:

CODE:/************关于本文档********************************************
*filename: get.h
*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 提供原始代码,我在他的基础上整理了此文
*********************************************************************/
int get ();
int set (int a); 


然后准备这样一个生成动态链接库的源文件:

CODE:/************关于本文档********************************************
*filename: get.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 

#include "get.h"



static int x=0;

int get ()

{

printf ("get x=%dn", x);

return x;

}

int set (int a)

{

printf ("set a=%dn", a);

x = a;

return x;




然后我们用 GNU 的 C/C++ 编译器来生成动态链接库,编译命令如下:

QUOTE: 
g++ get.cpp -shared -g -DDEBUG -o libggg.so 


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

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 

#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=%dn",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: 
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 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=%dn", a);
(gdb) list /* 查看当前代码行周围的代码,证明我们已经跟踪到动态链接库的源代码里面了 */
6 printf ("get x=%dn", x);
7 return x;
8 }
9 int set (int a)
10 {
11 printf ("set a=%dn", 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=%dn",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 /* 程序顺利执行结束 */
zhoulifa@linux# 


如果我们没有把动态链接库放到指定目录,比如/lib里面,调试就会失败,过程如下:

QUOTE: 
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 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
zhoulifa@linux#  


本次实验的环境是:
CPU:AMD Athlon(tm) 64 Processor 3000+
内存:512M
OS:Ubuntu GNU/Linux 6.06 dapper LTS
gcc:gcc 版本 4.0.3 (Ubuntu 4.0.3-1ubuntu5)

转载:http://www.loveunix.net/viewarticle.php?id=67138

|
学习...
我还没用过linux下写过动态库呢!难道linux下也有动态库之说?

|
楼主只是说,库路径不识别,如果在shell先export LD_LIBRARY_PATH=. 那么也能调试当前位置的动态库

|
linux也有的哦~

    
 
 

您可能感兴趣的文章:

  • 如何使用linux下gdb来调试python程序
  • linux 新手散分贴 我要在linux下调试多个.c和.h文件的程序 怎么调试?
  • linux下用gdb调试程序感觉非常不方便,不知道大家使用的什么工具进行调试的呀?
  • linux gdb: 我在一台机器上编译的程序用GDB可以调试,把程序放到另外一台机器上调试,调试信息就没有了 这是什么原因呢?
  • linux下调试的问题
  • 请问Linux下的C语言程序开发大家如何进行断点调试和单步调试?
  • 请教 Linux 中 eclipse + CDT 调试问题
  • linux下调试程序...
  • 关于linux下eclipse调试c++程序的问题
  • 到底怎么样调试linux内核啊?
  • linux下有没有类似于debugview的东东///或者linux下除了gdb,还有什么可以用于调试的软件吗?
  • 请问载linux下如何调试汇编程序,有没有像debug的程序。
  • linux下的调试工具
  • Linux程序调试工具 XBuildStudio
  • linux下如何单步或设置断点调试驱动或应用程序
  • LINUX下的程序调试问题
  • 调查一下:编写Linux内核模块 驱动程序各位高手所用的编辑环境和调试工具
  • linux 下用gdb调试器出现问题
  • 在Linux下用哪种调试工具比较好!(有加分!!!)
  • 请问linux中如何跟踪调试USB无线网卡驱动
  • 求一linux下图形调试工具
  • linux中静态链接库调用了另一个静态链接库
  • linux中都有哪些链接方式,创建链接的命令是什么?
  • linux下什么函数是用来“创建软链接和硬链接的呢“有么,今天突然想到这个问题。。
  • 急:请问SSH2链接是什么意思?在windows终端怎样具体操作来通过SSH2链接管理linux服务器?
  • linux下静态库使用:"未使用链接器输入文件,因为链接尚未完成"
  • 请以一个视频文件为例,说明一下linux的硬链接跟软链接的区别
  • 从Linux拷贝文件时,总出现符号链接错误时怎么回事?
  • linux链接问题!!
  • Linux下gcc编译时,如何以静态链接的形式编译?
  • 请问linux的链接库
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • linux能否成为动态域名解析客户端的动态域名解析服务器?
  • Linux下c函数dlopen实现加载动态库so文件代码举例
  • linux动态链接库里全局变量和静态变量会导致动态库不可重入吗?
  • Linux下,怎么确定动态库的绝对位置(动态库里面确定)?
  • linux动态路由问题
  • 在linux下(c++),如何动态调用 动态库(.so)? 为什么我编译报错:undefined reference to "dlopen"
  • linux能否使用*.DLL型动态链接库
  • Linux 动态库,静态库的一些疑惑
  • 最菜的问题—关于linux“动态库”的问题
  • linux下链接一个动态库后原有程序不能正常运行
  • Linux动态库编译问题
  • linux下获取动态库的加载路径
  • linux下动态链接库函数找不到
  • 请教一下Linux的动态库加载方式(是启动加载还是运行加载?)
  • linux下怎么设置调用的动态库的路径
  • 请问在linux下制作动态库应该注意些什么(欢迎大家讨论)
  • 送分.......linux下动态库和静态库的后缀名是什么呢?
  • 请问unix/linux下动态连接库和静态连接库有什么区别?
  • linux下的动态库。
  • 用GTK开发的程序如何在没有GTK动态连接库的Linux里运行?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3