在多次运行中调试具有相同内存地址位置的程序?

Posted

技术标签:

【中文标题】在多次运行中调试具有相同内存地址位置的程序?【英文标题】:Debug a program with equal memory address locations over multiple runs? 【发布时间】:2015-02-12 03:34:36 【问题描述】:

我有一个正在 Visual Studio 2010 中调试的程序。程序中出现了一个可重现的错误,我正在打印一些诊断信息。该错误使程序处于不良状态,因此我必须不断重新启动程序。每次我运行程序时,我的结构的地址都是不同的。它们有很多,如果每次运行程序时地址都保持不变,调试起来会容易得多。

地址看起来几乎相似但又不同。例如,一个结构的地址一次为 0x003F5540,下一次为 0x003E5540,下一次为 0x00605540 和 0x004F5540。

代码每次执行完全相同,所以我不知道为什么我看到的地址略有不同。我已经关闭了 ASLR 和 DEP。每次运行程序时如何获取相同的地址?

谢谢

编辑 - 可能无法禁用堆和堆栈随机化:1st call to "new" always returns different addresses. How do I get it to return the same address?

【问题讨论】:

【参考方案1】:

没有“可能”,地址随机化一直是自 16 位保护模式以来每个操作系统的核心。否则你不能两次运行相同的进程。或者选择重叠虚拟基地址的两个进程。

使用符号名称而不是指针值,这就是调试符号的用途!

【讨论】:

以上是关于在多次运行中调试具有相同内存地址位置的程序?的主要内容,如果未能解决你的问题,请参考以下文章

shmat()为不同的程序返回不同的地址,所有程序都具有相同的共享内存[重复]

在 VS C++ 6.0 中,哪些调试工具可以很好地找到内存泄漏的位置?

Visual Studio 2008 C++ 误报内存地址位置

-6在vs内存中地址

代码重定位和位置无关码

[CentOS 7系列]变量