【转】gdb调试动态链接库

【原文地址】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 参数。我这篇文章里将讨论一下用 gdb 来调试动态链接库的问题。首先,假设我们准备这样的一个动态链接库:引用:库名称是: ggg 动态链接库文件名是: libggg.so 头文件是: get.h 提供这样两个函数调用接口:

   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\n", x);
        return x;
}

int set (int a)
{
        printf ("set a=%d\n", 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\n",a,b,c,d);

        return 0;
}

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

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

否则就用下面这条命令:

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

下面我们就开始调试上面命令生成的 app 程序吧。如果已经把上面生成的 libggg.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\n", a);
(gdb) list   /* 查看当前代码行周围的代码,证明我们已经跟踪到动态链接库的源代码里面了 */
6               printf ("get x=%d\n", x);
7               return x;
8       }
9       int set (int a)
10      {
11              printf ("set a=%d\n", 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\n",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不能找到libggg.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,然后再设置断点就可以了,共享库只有当程序运行才开始加载的 

转载于:https://www.cnblogs.com/ybgame/archive/2012/03/23/2414078.html

GDB/Core Dump/静态链接库/动态链接库 GDB 生成可调式程序 GDB基本命令 Core Dump core dump定义 core dump使能 core文件分析 静态链接 特点 静态库编译选项 制作静态库 动态链接 制作动态链接库 GDB 生成可调式程序 gcc -g test.c -o test -g 选项表示生成程序可以使用GDB进行调试 GDB基本命令 基本命令 参... 阅读详情

相关推荐

Android Profiler 帧率优化实战与性能调优

本文详细介绍了使用Android Profiler进行帧率优化与性能调优的实战方法。通过分析主线程状态、FPS曲线和渲染阶段耗时,精准定位卡顿根源,并提供减少过度绘制、优化绘制命令及改善资源使用的具体策略。文章结合电商、游戏等真实案例,帮助开发者有效解决卡顿问题,提升应用流畅度。

palm99的专栏 515

静态库动态库和GDB调试

最后一种方式:把动态库文件放入/lib/或者/user/lib/目录下 --》不建议使用,包含系统自带的库文件,可能会替代;但是,重新打开一个终端,环境变量需要重新配置,临时;使用start运行gdb程序,程序从第一行开始;next: 直接一步一步执行不会进入函数体--输出调用结果;在编译时没有带-g : --可执行文件中没有加入源代码信息。退出gdb程序断点就没有了,再次进入需要重新设置断点;程序没有断点使用run运行调试程序,直接运行结束;程序停到下一个断点,但没有设置断点直接运行结束;

juanjuan5826的博客 2324

基于STM32的设计智慧超市管理系统(带收银系统+物联网环境监测)_167

本系统主要由超市环境监测部分和商品管理部分组成。环境监测部分主控芯片采用STM32F103C8T6,主要包括温湿度传感器、烟雾传感器和空调制热开关、空调制冷开关,采集的数据通过ESP8266模块+MQTT协议上传至OneNet云平台,在OneNet云平台设计手机和电脑版本可视化页面,能够在页面上查看超市的环境信息,还能在页面上手动打开空调制热开关和空调制冷开关。商品管理部分主要由RC522-RFID读卡器、上位机组成,实现商品选购、结算、顾客的VIP会员卡注册管理等功能。

6021

gdb 加载动态库方法

"这样的提示,这通常是库搜索路径设置错误,GDB载入了错误的库文件导致的。4. 查看so库的加载路径是否正确可使用info sharedlibrary命令,如果已找到对应的文件则其From和To的加载地址会有值,并且右边路径显示的就是加载文件所在的地址,这个时候,如果so库文件含符号信息,则syms Read的值为Yes,否则为No,如果未找到对应的文件则From和To的地址为空,syms Read的值为No,此时右边路径显示的是Coredump文件中库文件路径。但在载入过程中有库版本不匹配的提示。

mayi_xiaochaun的博客 4500

【linux】创建和使用动态库 GDB调试工具

创建和使用动态库 GDB调试工具

m0_73189710的博客 1258

GDB之(3)加载指定动态库文件

GDB(GNU Debugger)是GNU开源组织发布的一个强大的Unix/Linux程序调试工具。在软件开发的调试阶段,GDB提供了程序员在程序暂停执行的情况下,查看和修改程序内部的功能。这对于跟踪错误和异常行为,在复杂的系统中尤为重要。当程序员面对的问题是需要调试的程序依赖特定版本的共享库文件时,GDB加载指定库文件的能力就变得尤为重要。通常,系统可能有多个版本的库文件,或者开发者可能希望测试程序在使用不同版本库文件时的行为。在这种情况下,GDB就需要能够加载和使用指定的库文件。

梅花香自苦寒来,宝剑锋从磨砺出。 3158

使用gdb调试动态链接库

编译选项 在使用gdb进行调试之前,必须保证编译的可执行程序和想要调试的动态库编译包含了-g选项。这里还有一个坑,有时候我们虽然指定-g进行了编译,但是编译完成后又使用strip命令去除了调试信息,那么最终的程序和库也是没有调试信息的。此时也是无法进行gdb调试的。 gdb调试命令 当使用gdb运行时,要执行如下命令: gdb test 此命令会运行一个名为test的可执行程序,如果库能够在运行...

程序猿Ricky的日常干货 4681

GDBGDB多线程查看堆栈|调试多线程总结

例子 2021-09-29 16:37:17.931204 7fff637f7700 422708 59 ERROR RDMAStack in polling_start 2021-09-29 16:37:17.931227 7fff637f7700 422708 59 ERROR RDMAStack polling_start start polling thread:1 [New Thread 0x7fff4475f700 (LWP 423826)] 2021-09-29 16:3.

我的笔记本 1万+

GDB调试命令大全

使用singal命令,可以产生一个信号量给被调试的程序。如:中断信号Ctrl+C。这非常方便于程序的调试,可以在程序运行的任意位置设置断点,并在该断点用GDB产生一个信号量,这种精确地在某处产生信号非常有利程序的调试。single命令和shell的kill命令不同,系统的kill命令发信号给被调试程序时,是由GDB截获的,而single命令所发出一信号则是直接发给被调试程序的。UNIX的系统信号量通常从1到15。所以取值也在这个范围。

z2812470857的博客 3660

linux下 GDB 调试动态链接库

> gdb <你的可执行程序> (gdb) b main # 设置入口断点 (gdb) r [可执行程序的命令行参数] # 启动调试 (gdb) load <要调试的动态库, 如 test.so> # 将动态库加载入内存 (gdb) dir <要调试的动态库的源码路径, 如 ./src> (gdb) sharedlibrary <要调试的动态库> # 将动态库的符号读入gdb,为了你能找到变量和函数名 (gdb)...

北雨南萍 8331

GDBGDB多线程查看线程堆栈|GDB 调试多线程和多进程总结

目录 GDB多线程查看崩溃时线程的堆栈 线程的查看以及利用gdb调试多线程 GDB 调试多线程和多进程总结 排除步骤 调试多进程 一、gdb的基础知识复习 二、使用gdb调试多进程 三,gdb 调试多线程 四、设置线程名字(便于分析) linuxGDB动态链接库调试 GDB设置线程锁(一个线程动其他不动) 作者:banda...

小鱼菜鸟的博客 4659

gdb调试动态链接库

自:http://www.cnblogs.com/ybgame/archive/2012/03/23/2414078.html 在 Linux 可以用 gdb调试应用程序,当然前提是用 gcc 编译程序时要加上 -g 参数。我这篇文章里将讨论一下用 gdb调试动态链接库的问题。首先,假设我们准备这样的一个动态链接库:引用:库名称是: ggg 动态链接库文件名是: lib

yasi_xi的专栏 2万+

gdb如何调试动态链接库问题

gdb如何调试动态链接库的问题。比如我想调试的代码为动态链接库代码,我设置断点后却得到以下错误 (gdb) b mps_guide_db.c:1699 No source file named mps_guide_db.c. Make breakpoint pending on future shared library load? (y or [n]) [answered N; input

惊鸿一瞥 7659

gdb 远程调试android进程

什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C、C++代码。 它主要可以做4件事情: 随心所欲地启动你的程序。设置断点,程序执行到断点处会停住。(断点可以是表达式)程序被停住后,可以查看此时程序中发生的事。动态改变程序的执行环境。 GDB远程调试原理图 如图上所示,我们需要使用gdbserver依附到我

做好当下 2万+

gdb如何调试动态链接库

参考 gdb如何调试动态链接库问题 GDB调试动态库

beibeix2015的博客 2395

gdb调试动态链接库

大家都知道在 Linux 可以用 gdb 来调试应用程序,当然前提是用 gcc 编译程序时要加上 -g 参数。  我这篇文章里将讨论一下用 gdb 来调试动态链接库的问题。  首先,假设我们准备这样的一个动态链接库:  引用:  库名称是: ggg  动态链接库文件名是: libggg.so  头文件是: get.h  提供这样两个函数调用接口:      int get ();

华的专栏 2787

【Linux操作系统】深入了解系统编程gdb调试工具

本文详细介绍了Linux中gdb调试工具的使用方法,并通过实例演示了其调试功能。通过使用gdb,开发者可以更好地定位和解决程序中的bug,提高开发效率。

Goforyouqp的博客 1万+

gdb使用及原理【

1、GDB的主要功能:修复Bug、分析程序架构; 2、组成架构:支持本地调试和远程调试(主要应用于嵌入式系统开发)

小新 1893

A股羊群效应CSSD CSAD数据与Stata代码数据(2000-2023).txt

因文件较多,数据存放网盘,txt文件内包含下载链接及提取码,永久有效。样例数据及详细介绍参见文章:https://blog.csdn.net/samLi0620/article/details/139934501

上一篇: AS3加载AS2的swf文件报错
下一篇: GLUT函数说明(转载)
alteken5150
博客等级 码龄10年 13粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值