c - 查找特定内存位置的数据最后一次修改的时间? (C、gcc、gdb、valgrid、clang?)

标签 c debugging gcc memory segmentation-fault

我有一个令人讨厌的段错误,已经困扰我一段时间了。它与代码从 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/

相关文章:

c - #定义相关查询

c - 如何获取字符串大小

XCode 4 调试器 : Attach to process from command line

javascript - TypeError : pokemon. map 不是函数

c - 如何在 C 中创建临时缓冲区?

c - 如何在 c 中 exec() 我的程序?

android - 此类文件的 jar 属于容器 'Android Dependencies',它不允许对其条目上的源附件进行源修改

android - rand() 函数仿生与 glibc

c - 如何在不显式链接数学库的情况下使用带有 gcc 的 c 中的数学函数

c - 有什么方法可以在 msp430 中进行多精度运算(使用大于 64 位的整数)?