LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 872|回复: 4

哪位兄台解释一下gdb怎么重新载入被调试程序?

[复制链接]
发表于 2005-8-30 00:03:48 | 显示全部楼层 |阅读模式
我的一个源代码test.c
编译:
gcc -c test.c -g
gcc -o test test.o -g

开始调试:
gdb test
(gdb) break 10
(gdb) break 12
(gdb) run
这时,我在另一个shell将test.c的第12行修改,按以上的过程编译一遍。
回到gdb:
(gdb) list 12
发现新作的修改已经生效了。gdb是怎么载入被调试程序的呢?是在gdb console中每执行一条命令,gdb都要重新载入吗?

谁能解释一下。

另外,我在Windows下用16位MASM汇编也试了一下。用debug.exe打开一个刚用16位汇编写的exe,用U命令看反汇编,载入之后再在外部编译一次,再用U看反汇编,没有改变。这和gdb不同啊。
发表于 2005-8-30 08:53:58 | 显示全部楼层
虽然你用 list 看到的代码变了,但是你有没有发现运行结果并没有变吗?
list 是去读那个源文件,然后列出你需要的行,并没有载入程序.程序每次 run 会被载入一次,
回复 支持 反对

使用道具 举报

发表于 2005-8-30 08:55:05 | 显示全部楼层
对了,如果想了解gdb的细节,有篇文章推荐读:
http://sources.redhat.com/gdb/current/onlinedocs/gdbint_toc.html
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-30 14:38:48 | 显示全部楼层
Post by rickxbx
虽然你用 list 看到的代码变了,但是你有没有发现运行结果并没有变吗?
list 是去读那个源文件,然后列出你需要的行,并没有载入程序.程序每次 run 会被载入一次,

确实像你说的那样。
我又用一个链接了共享库的可执行文件test来试。编译的过程:
gcc -c test.c -g
gcc -o test test.o -L. -lmyso -g
共享库的编译:
gcc -fPIC -c  libmyso.c -g
gcc -shared -Wl,-soname,libmyso.so -o libmyso.so.1.0.0 libmyso.o -lc -g
ln -s libmyso.so.1.0.0 libmyso.so
调试:
gdb test
(gdb) break 15   //这一行有共享库的一个接口
(gdb) run
此时在外部将libmyso从编译。
(gdb) next
发现结果仍然按旧的共享库运行。共享库要在运行期才调用,比如我只修改共享库后编译它,不动test,但test运行时就已经用的是修改后的共享库。不过好像gdb调试的时,它载入程序就把代码(ELF二进制?)一起载入了,所以共享库的更新反映不出来。
回复 支持 反对

使用道具 举报

发表于 2005-8-30 14:44:44 | 显示全部楼层
更改以后,需要重新start一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表