当前位置:  开发笔记 > 后端 > 正文

如何运行时调试共享库?

如何解决《如何运行时调试共享库?》经验,为你挑选了2个好方法。

谁能告诉我如何在共享库上进行运行时调试?

我需要在我的共享库中运行调试一个函数,但是它被另一个程序调用.如何使用共享库执行dbx之类的操作?

我在AIX上使用dbx.对于我想要做的事情,gdb比dbx更好吗?



1> lothar..:

您只需要使用可执行文件调用gdb(无论是您的还是第三方都无关紧要).这是我调试ls命令并在(共享)c库中设置断点的示例.此示例使用gdb 6.8,它支持延迟(挂起)断点,这使得这很容易:

gdb /bin/ls
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu"...
(no debugging symbols found)
(gdb) b write
Function "write" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (write) pending.
(gdb) r
Starting program: /bin/ls
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
[Thread debugging using libthread_db enabled]
(no debugging symbols found)
(no debugging symbols found)
[New Thread 0x7f98d2d23780 (LWP 7029)]
[Switching to Thread 0x7f98d2d23780 (LWP 7029)]

Breakpoint 1, 0x00007f98d2264bb0 in write () from /lib/libc.so.6
(gdb)

如您所见,gdb自动管理可执行文件使用的所有线程.你不必为那里的线程做任何特别的事情.断点可以在任何线程中使用.

或者,如果您想将调试器附加到已经运行的应用程序(我在这里使用tail -f/tmp/ttt作为示例):

ps ux | grep tail
lothar    8496  0.0  0.0   9352   804 pts/3    S+   12:38   0:00 tail -f /tmp/ttt
lothar    8510  0.0  0.0   5164   840 pts/4    S+   12:39   0:00 grep tail

gdb
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu"...
(no debugging symbols found)
(gdb) attach 8496
Attaching to program: /usr/bin/tail, process 8496
Reading symbols from /lib/librt.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/librt.so.1
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/libpthread.so.0...(no debugging symbols found)...done.
[Thread debugging using libthread_db enabled]
[New Thread 0x7f24853f56e0 (LWP 8496)]
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/ld-linux-x86-64.so.2...
(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
(no debugging symbols found)
0x00007f2484d2bb50 in nanosleep () from /lib/libc.so.6
(gdb) b write
Breakpoint 1 at 0x7f2484d57bb0
(gdb) c
Continuing.
[Switching to Thread 0x7f24853f56e0 (LWP 8496)]

Breakpoint 1, 0x00007f2484d57bb0 in write () from /lib/libc.so.6
(gdb)



2> 1800 INFORMA..:

通常,调试共享库的过程与调试可执行文件的过程大致相同 - 主要区别在于,在共享库加载到内存之前,您可能无法设置断点.您将调试器附加到主可执行文件.

如果您正在调试不属于您的应用程序,但是在插件体系结构中使用您的模块,则仍然使用相同的方法.确保(一如既往)您拥有可用于共享库的调试信息.在Windows中,您将生成.pdb文件.使用gcc,我认为您指定了一个特殊的编译器标志(-g?)以确保提供调试信息.您将调试器附加到第三方应用程序.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有