GDB调试动态库so问题?

vcclass 2006-11-15 12:56:50
#get.h 头文件内容如下:
int get ();
int set (int a);

#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;
}

编译为库文件:gcc get.cpp -shared -g -DDEBUG -o libggg.so

测试程序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;
}

编译后执行app,输出正确,现在需要调试库文件,要在get函数,set函数里设置断点。

gdb app
b main
run

b get
此时提示 :Cannot access memory at address 0x5cc,

请问各位大侠,该如何在库的源文件里设置断点呀?所有的文件都在同一个目录里的呀。
...全文
6214 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
vcclass 2006-11-21
  • 打赏
  • 举报
回复
呵呵,不错,感谢各位大侠。确实是copy了一个 libggg.so到 /usr/lib目录。
laomai 2006-11-20
  • 打赏
  • 举报
回复
haoel(耗子) ( ) 信誉:100 Blog 2006-11-18 12:01:17 得分: 0

老迈,我记得我们似乎早已认识了。呵呵。

--------------------------
恩?你是哪个饼子?还是在我的msn上?呵呵



无知者无谓 2006-11-20
  • 打赏
  • 举报
回复
谢了,作了2年Linux下开发,既然没想过要调试.so的,平时都是对每个模块写测试用例,通过了就算了,汗一个先
liuchangyan 2006-11-19
  • 打赏
  • 举报
回复
mark
fymq 2006-11-19
  • 打赏
  • 举报
回复
gdb 调式共享库现在似乎还不完善,
至少是在 x86 / Linux 平台下是这样。
在 HP-Unix 上要完善很多,可能是惠普贡献的代码吧,
在 gdb manual 上已经说的很清楚了。
haoel 2006-11-18
  • 打赏
  • 举报
回复
老迈,我记得我们似乎早已认识了。呵呵。
asert 2006-11-18
  • 打赏
  • 举报
回复
mark
johndiyang 2006-11-18
  • 打赏
  • 举报
回复
mark
lbaby 2006-11-18
  • 打赏
  • 举报
回复
哈哈,村长居然来跑来Linux版来趟混水来了,嘿嘿
haoel 2006-11-17
  • 打赏
  • 举报
回复
Ropyn(剑心) :

再加上你的补充,就更加完整了。:)

另外,根据我的经验来看,很多初学者都不能够很好的描述问题,这是正常的,不能怪他们。因为他们本来就不清楚,所以才问,因为本来就不懂,所以才问不清楚。而对于我们比较懂的人来说,怎么和他们进行有效的沟通和交流,引导他们应该来说是我们的责任。比如,这里,我把所有的步骤列出来,于是,我们和他们就有了一个可以交流媒介。而不是,他在他的步骤里说事,我在我的步骤里说事。

很多情况下,技术大拿们不是在问题表面上进行解答,更多的时候,为了解决问题需要从一些基础知识上讲起。当然,这会让我们觉得很麻烦,有时候也会让这些技术大拿们觉得很反感。这个也需要相互的理解。:)


alaiyeshi(七宝树八宝饭):
呵呵,我应该是你认识的那个耗子。我的CSDN用户ID和我的MSN是一样的。谢谢你啊。
DanXer 2006-11-17
  • 打赏
  • 举报
回复
vcclass(黑山老妖)
你如果没设LD_LIBRARY_PATH你怎么能运行的起来。我就不明白了。上面你说可以运行:“编译后执行app,输出正确”。我也假设你的库搜索路径是正确的。
或者你在编译时指定了库搜索路径,所以叫你告诉我app编译的命令行。或是否你曾经将动态库拷贝到动态连接器的标准目录中了。好知道问题出在哪里?

库搜索路径的确定有很多方法,LD_LIBRARY_PATH只是其中一种。如编译命令行rpath参数. 连接时的LD_RUN_PATH环境变量。/lib,/usr/lib标准目录。动态连接器缓存/etc/ld.so.conf.

以后把问题说清楚别人才能帮你。
dongpy 2006-11-17
  • 打赏
  • 举报
回复
mark
laomai 2006-11-17
  • 打赏
  • 举报
回复
haoel(耗子) ,很佩服你的风度,我也是在搞linux开发的,能交个朋友么?呵呵
vcclass 2006-11-16
  • 打赏
  • 举报
回复
还是师傅(haoel(耗子))牛。文件解决。
关键的原因是:

设置LD_LIBRARY_PATH环境变量
> setenv LD_LIBRARY_PATH ${PWD}
> env | grep LD
LD_LIBRARY_PATH=/home/hchen/test/so
haoel 2006-11-16
  • 打赏
  • 举报
回复
vcclass (黑山老妖)你好,下面是我的测试结果。

1)文件列表:
> ls -l
-rw-r--r-- 1 hchen wheel 209 Nov 16 11:08 get.c
-rw-r--r-- 1 hchen wheel 28 Nov 16 11:07 get.h
-rw-r--r-- 1 hchen wheel 237 Nov 16 11:08 main.c
-rw-r--r-- 1 hchen wheel 213 Nov 16 11:52 makefile

2)Makefile的样子
> cat ./makefile
all:main

libget.so:get.c
gcc -g -c -o get.o get.c
gcc -g -shared -o libget.so get.o

main:main.c libget.so
gcc -g -c -o main.o main.c
gcc -g -o main main.o -L./ -lget

clean:
@rm libget.so get.o main.o main

3)编译程序
> make
gcc -g -c -o get.o get.c
gcc -g -shared -o libget.so get.o
gcc -g -c -o main.o main.c
gcc -g -o main main.o -L./ -lget

4)设置LD_LIBRARY_PATH环境变量
> setenv LD_LIBRARY_PATH ${PWD}
> env | grep LD
LD_LIBRARY_PATH=/home/hchen/test/so

5)用GDB调试(step in)
> gdb ./main

(gdb) break main
Breakpoint 1 at 0x80484d0: file main.c, line 5.
(gdb) r
Starting program: /home/hchen/test/so/main

Breakpoint 1, main (argc=1, argv=0xbfe62fc4) at main.c:5
5 int a = 100;
(gdb) n
6 int b = get ();
(gdb) s <------- 进入动态库
get () at get.c:7
7 printf ("get x=%d\n", x);
(gdb) s
get x=0
8 return x;

6)用GDB调试(break set)
(gdb) break set
Function "set" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y

Breakpoint 1 (set) pending.


我的GDB版本如下:(操作系统是RedHat Enterprise Linux Advance Server 4)
(gdb) show version
GNU gdb Red Hat Linux (6.1post-1.20040607.62rh)
Copyright 2004 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 "i386-redhat-linux-gnu".
DanXer 2006-11-16
  • 打赏
  • 举报
回复
可执行怎么编译的?贴出来
你是不是曾经把libggg.so拷到其他地方了。
vcclass 2006-11-16
  • 打赏
  • 举报
回复
wqf363(denny),你这种方法是不行的。
alaiyeshi 2006-11-16
  • 打赏
  • 举报
回复
haoel(耗子),是不是真的耗子啊?我有真的耗子的msn,看看我的名字就知道我是哪个了?
恭喜真的耗子,赢了,胜利了
zmzbs123 2006-11-16
  • 打赏
  • 举报
回复
厉害
仰望星空WU 2006-11-15
  • 打赏
  • 举报
回复
b 源文件名 :行号 或 b 类名::函数
加载更多回复(5)

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧