我有一个令人讨厌的段错误,已经困扰我一段时间了。它与代码从 32 位迁移到 64 位有关,但这是一个偶然的错误,很难追踪。
我想知道——是否有任何工具(首选Linux,FOSS)可以用来从段错误中追溯到,以找到我的代码中非法(越界)指针被分配的位置值?
例如,如果我尝试读取变量 int *a
指向的 int
值(该值已被分配到其他地方),则出现段错误在我的代码中很远的地方),我如何在代码中找到值被分配的位置?
这似乎是人们可以用 clang/llvm 做的事情,但我真的不知道该去哪里寻找。我想这样的想法不能用 gdb 或 valgrind 来完成,因为据我所知,他们没有办法在程序执行期间存储所需的信息。
如果有人提出任何建议,我们将不胜感激!
编辑:经过多次挖掘,我发现了我一直在寻找的错误。基本上,“unsigned long *”被强制转换为“int *”,以某种方式抑制警告( http://ascend4.org/b564 )。不过,问题仍然存在,因为我的错误搜索非常手动且乏味:如果我的程序中有一个变量,我如何回溯以找到语句的序列/链/树导致它采取其当前值?是否有任何工具可以自动执行此操作?这包括将参数传递给函数、赋值语句(包括通过取消引用的指针进行赋值)等。
最佳答案
内存断点(GDB 文档中的观察点)听起来像是可行的方法。使用 -g
进行编译以调试符号,然后放置一个内存写入断点,如下所示:
print &a
watch *0xdeadbeef
如果您也想包含读取内容,可以使用awatch
。检查GDB docs for more information 。
这样您应该能够跟踪段错误发生之前的最后一次写入。
关于c - 查找特定内存位置的数据最后一次修改的时间? (C、gcc、gdb、valgrid、clang?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29274259/