问题标签 [pageheap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3684 浏览

visual-c++ - 调试 Visual C++ 内存分配问题

我正在调试一个最终崩溃并显示以下消息之一的软件:

该软件确实很旧,但现在更改它不是一种选择。它是在 Visual C++ 6.0 上编写的。我们猜测这是某种缓冲区溢出,因此我们正在尝试寻找方法来检测它发生的位置。

我找到了有关PageHeap(似乎能够告诉我我想要什么)和GFlags的信息,但似乎我无法使其工作。

我创建了一个测试程序:

这引发了一个错误:

然后,我尝试通过运行将 PageHeap 附加到它:

然后重新运行它(通过 Visual C++ 6.0 界面和 Windows 资源管理器),导致相同的错误。

然后我尝试编译发布版本,并通过Visual C++ 6.0界面运行,得到错误:

从 Windows 资源管理器中,我刚刚得到了 Windows 对话框,要求我发送错误报告。

我错过了什么?

0 投票
3 回答
4385 浏览

c++ - CSocket:: 在我的 MFC 应用程序中创建抛出异常

我让我的应用程序(VC MFC)在启用 Pageheap 的 gflags 下运行,以跟踪页面堆损坏。

现在应用程序崩溃并显示此错误,我无法解释这些行(除了感觉资源不可用)

任何人都可以阐明导致应用程序崩溃的确切原因是什么?

(信息:应用程序是一个多线程的,大约有 500 个线程在多处理器机器上运行)

0 投票
2 回答
373 浏览

c++ - PageHeap 不显示确切的崩溃位置

我正在使用 PageHeap 来识别堆损坏。我的应用程序有堆损坏。但是当应用程序为传递给方法的字符串创建 stl 对象时,应用程序会中断(由于崩溃)。我在崩溃位置附近看不到任何可见的内存问题。我启用了整页堆来检测堆损坏和 /RTCs 来检测堆栈损坏。

我应该怎么做才能在发生堆损坏的确切位置中断?

0 投票
1 回答
375 浏览

c++ - Pageheap 不会让我的应用程序崩溃

我预计 Pageheap 会在执行以下代码段中的第二条和第三条语句时强制我的应用程序崩溃。但这并没有发生。我为应用程序启用了整页堆。

我应该做哪些额外的事情来制作 pageheap 以在第二个和第三个语句中破坏我的应用程序?

但是如果我使用,以下语句 pagebreak 会破坏我的应用程序

0 投票
2 回答
359 浏览

c++ - HEAP_NO_SERIALIZE 堆中的多线程访问

我们的应用程序因以下错误而崩溃。

我们为应用程序启用了整页堆。应用程序在随机位置崩溃。通常崩溃位置是STL的内部部分。在所有情况下,调用堆栈似乎都已损坏。

该应用程序使用库和 DLL 文件列表。所有 DLL 文件和库都是使用多线程 DLL 库(命令行选项/MD)构建的。

其中一个库使用HeapAlloc方法在堆中分配内存。

我应该使用什么技术来识别崩溃?

0 投票
1 回答
753 浏览

windows - 页面堆消耗大量内存

在过去的四年中,我使用 pageheap 来调试堆损坏。一般来说,我没有任何问题。但现在我面临着奇怪的行为。在 win7-sp1-x86 主机中使用具有以下标志的全局标志为我的进程启用页面堆后:-启用堆尾检查-启用无堆检查-启用页面堆

我注意到内存不足异常导致崩溃。!address -summary 命令表示 PageHeap 消耗了大约 90% 的虚拟内存。

这对我来说真的很奇怪,因为据我所知,pageheap 不应该导致如此大的内存开销。

请有人解释这种行为的原因是什么?

0 投票
2 回答
1156 浏览

c - 在 buf = malloc(1) 与整页堆之后,为什么直到 buf[16] 被覆盖才抛出保护页异常?

  1. 错误中的代码

    /li>
  2. 从 Visual Studio 2010 的项目菜单中确保构建为“Release”和“x64”(机器为 x64)

  3. 启用整页堆

    /li>
  4. 使windbg默认调试器

    /li>
  5. cmd在没有调试器的情况下将代码作为单独的 exe 运行

    输出:

    之后,windbg 被发现腐败。而且我认为整页堆应该可以立即捕获损坏。

    关于为什么整页堆很烂的任何评论?

0 投票
0 回答
100 浏览

pageheap - 当我使用 gflags 启用带有标志的页面堆时,GetPrivateProfileString 失败(完全未对齐的跟踪)

我的代码是这样的:

config.ini 的上下文如下:

但是当调用 GetPrivateProfileString 时,szValue 的上下文是空的!当我禁用页面堆时,szValue 的上下文是“daemon.dll”。当我使用标志(完整跟踪)启用页面堆时,szVaule 的上下文是“daemon.dll”。

API GetPrivateProfileString 是否存在错误?

0 投票
0 回答
425 浏览

windows - 开启 App Verifier 时 gethostbyname API 失败

我在尝试打开 Page Heap 的应用程序验证器下测试应用程序时遇到了问题。事实证明,即使对于像“localhost”这样的合法主机名,gethostbyname API 也总是失败。这个问题在我尝试过的每个 Win-7 或 Server 2008 R2 上都会重现,即使是使用 gethostbyname 的非常简单的测试应用程序。

复制步骤:在 appverifier 中检查“page heap”和“UseLFGGuard...”复选框,使用 gethostbyname(..) 运行任何应用程序。

应用验证标志

应用程序代码示例(appverifier 关闭时打印“127.0.0.1”,appverifier 开启时打印“getaddrinfo failed”):

最不寻常的是,我在互联网上找不到任何东西。这是一个已知问题吗?任何解决方法?

0 投票
3 回答
427 浏览

c - 微软的 strncat 读取超出源缓冲区边界的字节

我观察到 Microsoft 实现的一个有趣的问题strncat。它触及源缓冲区之外的 1 个字节。考虑以下代码:

strncat在 112 字节块之后读取 1 个字节。因此,如果您不幸在无效页面边界上获得分配,您的应用程序就会崩溃。大型应用程序可能会在这些地方间歇性地崩溃。(请注意,可以使用gflags PageHeap设置来模拟这种情况;块大小必须能被指针大小整除才能正确对齐。)

这是预期的行为还是错误?有什么链接可以确认吗?(我阅读了一些描述,strncat但可以根据您最初的想法来解释它们的两种方式......)

更新(回答有关证据的问题):如果从上面的文字中不清楚,我很抱歉,但这是一个实验事实。strncat我在读取地址 src+srcBufSize的应用程序中观察到间歇性崩溃。在这个使用gflags PageHeap运行的小示例中,崩溃时始终重现 (100%)。因此,据我所知,证据非常确凿。

Update2(编译器信息)MS Visual Studio 2005 版本 8.0.50727.867。构建平台:64 位版本(32 位无复制)。用于重现崩溃的操作系统:Windows Server 2008 R2。

更新 3使用 MS Visual Studio 2012 11.0.50727.1 中内置的二进制文件也会重现该问题

更新 4 链接以在 Microsoft Connect 上发布链接到 MSDN 论坛上的讨论

更新 5该问题将在下一个 VS 版本中修复。没有计划对旧版本进行修复。请参阅上面的“Microsoft Connect”链接。