使用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调试回调的主要内容,如果未能解决你的问题,请参考以下文章

GDB调试

使用GNU/gdb调试Linux C/C++可执行程序查看出错源代码、设置断点

gdb调试中怎么查看其中一行的汇编代码

GDB调试汇编分析

代码调试篇:gdb调试快速入门指南

代码调试篇:如何编写 gdb 自定义命令