gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:25:07 25 4
gpt4 key购买 nike

我有一个讨厌的段错误已经困扰了我一段时间。它与代码从 32 位到 64 位的迁移有关,但这是一个偶然的错误并且很难追踪。

我想知道 - 是否有任何工具(首选 Linux,FOSS)可用于从段错误中追溯,以找到在我的代码中为非法(越界)指针分配的位置值(value)?

例如,如果我试图读取由我的变量 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、valgrind、clang?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29274259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com