我正在尝试验证共享对象库中函数的功能。在带有main
函数,我会简单地start
程序和 gdb 会自动在 main 上设置断点,但这显然在这里不可用。
假设我有一些add.c
:
long add(long x, long y) {
return x + y;
}
我编译这个gcc -shared -o libadd.so -fPIC add.c
并将其加载到GDB中:
(gdb) file libadd.so
Reading symbols from libadd.so...(no debugging symbols found)...done.
(gdb) start
Function "main" not defined.
Make breakpoint pending on future shared library load? (y or [n])
Starting program: /tmp/minimal/libadd.so
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000001 in ?? ()
最好,我希望能够使用类似于下面的 gdb:
(gdb) file libadd.so
Reading symbols from libadd.so...(no debugging symbols found)...done.
(gdb) call (long)add(5,6)
$1 = 11
但是这个调用的结果是You can't do that without a process to debug
.
我可以在 GDB 中调试这样的库吗?
你可以这样做starti
, 如下所示:
(gdb) file libadd.so
Reading symbols from libadd.so...(no debugging symbols found)...done.
(gdb) starti
Starting program /tmp/minimal/libadd.so
Program stopped.
0x00007ffff7dfd4a0 in deregister_tm_clones ()
(gdb) call (long)add(5,6)
$1 = 11
您还可以使用包含 main 函数的二进制文件来执行此操作,如所示这个类似的问题 https://stackoverflow.com/questions/10483544/stopping-at-the-first-machine-code-instruction-in-gdb.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)