使用gdb调试回调
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用gdb调试回调相关的知识,希望对你有一定的参考价值。
我正在尝试使用gdb
调试一个C程序,一切正常,直到我传递指向一个函数的指针(到第三方库),之后gdb
失去焦点,程序运行时没有在我的回调函数中遇到断点。
例如,我从pcap_loop
库调用libpcap
,它希望指向我的回调函数got_packet
。
pcap_loop(handle, num_packets, got_packet, NULL);
一旦我用gdb
进入或超过这条线,我在got_packet
的断点就永远不会被击中。
为什么?
有任何想法吗?
答案
在某些情况下,可以跳过GDB断点,尤其是在调试启用了优化的编译代码时,但最可能的答案是库函数没有按预期执行。
GDB无法进入没有调试信息的库,因此只是看起来“失去焦点”,就像你设置的那样,在返回点上设置一个临时断点并等待函数完成。这仍然不应该阻止回调内部的断点触发。
如果您使用的是来自操作系统存储库的库,那么您可能会发现可以安装“调试”软件包。这将允许您进入库代码并可能解决问题的方式。
然而,添加printf
调试通常要简单得多,或以某种方式“破坏”got_packet
函数会导致信号(*(int *)0 = 1
),并以这种方式满足自己是否被调用。
如果你可以证明函数真正被调用,并且GDB确实没有捕获断点,那么你就会遇到GDB错误(或者可能是内核错误)。
以上是关于使用gdb调试回调的主要内容,如果未能解决你的问题,请参考以下文章