如何搜索“到下一行所述的无效地址”错误

时间:2015-12-02 00:54:31

标签: c++ debugging gdb valgrind

我正在创建一个包含太多代码的库来提供它。

我的问题是分段错误,Valgrind分析为:

  

跳转到下一行所述的无效地址
    在0x72612F656D6F682F:???     在[...](堆栈电话)

感谢this question,我想这是因为我在某处有一个堆栈损坏。

我的问题是:如何找到它? 我尝试使用GDB,但分段错误似乎不在同一个地方。 GDB告诉我它位于函数的第一行,而Valgrind告诉它这个函数的调用会导致分段错误。

2 个答案:

答案 0 :(得分:4)

如果问题是可重复的,你可以使用类似于this answer的技术在返回地址的位置设置一个观察点,并让GDB在违反指令后立即停止指令。

答案 1 :(得分:1)

由于这是几年前的事,所以您可能已经发现了自己的错误。但对于可能偶然发现此问题的任何人,我强烈建议您研究“消毒剂”。

如果您正在运行Memcheck,则可能运行AddressSanitizerclang中都存在的gcc。 AddressSanitizer通常可以比Memcheck更好地检测堆栈损坏问题。 (除了堆栈损坏之外,AddressSanitizer还可以检测许多不同类型的寻址错误)。

但是,如果您在Memcheck日志中向后滚动,则可能会看到Conditional jump or move depends on uninitialised value(s),在这种情况下,您使用的是未初始化的变量,该变量通常较难调试。为此,您可以尝试MemorySanitizer(当前仅适用于clang和Linux,https://clang.llvm.org/docs/MemorySanitizer.html)。特别是,请查看origin tracking选项。对于未初始化变量的使用,这比Memcheck提供了更好的原点跟踪。但是请注意,MemorySanitizer的设置并非易事,因为它通常要求使用(MemorySanitizer)工具来构建所有外部库。