观察内存位置/安装“数据断点”从代码?

发布于 2024-08-10 11:46:38 字数 195 浏览 14 评论 0原文

我们遇到了内存覆盖问题。在程序运行过程中的某个时刻,内存位置被覆盖并导致程序崩溃。该问题仅发生在发布模式下。在调试时,一切都很好。 这是一个经典的 C/C++ bug,而且很难定位。

我想知道是否有一种方法可以添加一些“调试代码”来监视这个内存位置,并在其更改后调用回调。这基本上是调试器在调试模式下可以做的事情(“数据断点”),但我们在发布中需要类似的东西。

We have a memory overwrite problem. At some point, during the course of our program, a memory location is being overwritten and causing our program to crash. the problem happens only in release mode. when in debug, all is well.
that is a classic C/C++ bug, and a very hard one to locate.

I wondered if there's a way to add some 'debugging code' that will watch this memory location and will call a callback once its changed. This is basically what a debugger could do in debug mode (a 'data breakpoint') but we need something similar in release.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

勿忘初心 2024-08-17 11:46:38

如果您可以控制变量的位置,那么您可以将其分配在专用页面上,并使用 VirtualProtect(在 Windows 上...不确定是否适用于 Linux)。

这样,当有人尝试写入时,您将遇到访问冲突。使用异常翻译器函数,您可以将其视为回调。

即使您无法直接移动变量(例如,它是类成员),也许您可​​以在变量周围添加足够的填充,以确保它位于专用页面上并使用相同的方法。

If you can control the location of the variable then you can allocate it on a dedicated page and set the permissions of the page to allow reads only using VirtualProtect (on Windows ... not sure for Linux).

This way you will get an access violation when someone tries to write to it. With an exception translator function you could treat this as a callback.

Even if you can't move the variable directly (eg. it is a class member), maybe you could add sufficient padding around the variable to ensure it is on a dedicated page and use the same approach.

不羁少年 2024-08-17 11:46:38

您仍然可以为“发布”代码段生成调试符号。这仍然可以通过调试器运行,就像在“调试”模式下一样。

我最近对我们的一个发布驱动程序做了类似的事情,以便我们可以通过 vtune 运行它。对于 Microsfot LINK,我添加了 -DEBUG 标志,对于 Microsoft CC,我添加了 -Zi。一切正常。 MSKB 链接

您可能会找到此链接很有用。

You can still generate debug symbols for a "release" piece of code. This can still be run through a debugger just like you would in "debug" mode.

I recently did something similiar with one of our release drivers so that we could run it through vtune. For the Microsfot LINK, I added the -DEBUG flag, for Microsoft CC I added -Zi. Everything works fine. MSKB link

You might find this link useful.

凝望流年 2024-08-17 11:46:38

假设您使用的是 Windows,请使用 Windbg 来调试您的程序并检查 ba 命令 - 当访问内存时,这将中断。

assuming you're using windows use windbg to debug your program and check out the ba command-this will break when the memory is accessed.

无声静候 2024-08-17 11:46:38

有一些工具可以用于此目的 - 例如堆代理和边界检查器以及许多其他可以发现覆盖的工具。基本上,您在内存分配结束时需要一些哨兵,并且需要检查它们。

There are tools for this - like heap agent and boundschecker and many others that will discover overwrites. Basically you need some sentinels at the end of your memory allocations and they need to be checked.

临风闻羌笛 2024-08-17 11:46:38

调试 API 是特定于平台的,但它们确实存在。 WindowsUNIX API 可以在网上找到。

Debugging APIs are platform-specific, but they do exist. Windows and UNIX APIs can be found online.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文