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

下面我们就开始调试上面命令生成的 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
);

(
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 /* 程序顺利执行结束 */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 arewelcome 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
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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值