【发布时间】:2012-02-16 09:02:53
【问题描述】:
有没有办法让我在不使用 mprotect(我不能使用)的情况下检测/启动-crash-on 写入字符串?
目前我只能在以下读取中检测到写入,但这为时已晚(以下读取可能来自完全不同的库)。
注意:由于优化器在进程内存中移动字符串,因此使用带有观察点的 gdb 失败。
编辑:有问题的变量是一个类成员 (char*),它包含一些元数据作为字符串的前缀。字符串是需要不可变的部分,前缀必须是可写的。我在类静态哈希中拥有数百万个这样的对象,并且可以从我们代码中的几乎任何地方访问它们。
【问题讨论】:
-
在未优化的代码上使用 gdb 观察点怎么样?
-
因为我无法在另一台机器上重现错误并将所有 libs\execs 替换为未优化将需要重新安装操作系统(这是非常低级的代码)
-
watch myString不是独立于优化器将您的字符串myString放置在哪里吗?弄清楚myString在内存中的位置不是调试器的头疼吗? -
是的,但我在看具体的内存地址。字符串本身不是问题,而是其中的一个小节。如果我看一个内存地址“看”不能说明优化。
-
@Neowizard 您能否发布一些代码,以便我们可以推断出您要查看的变量的更多信息? cos,如果它是一个全局变量,那么你可以检查你的
.map文件中的变量的确切地址,然后在GDB中使用它?