使用C++,今天在演示期间发现我正在遭受损坏的堆(但仅在重要场合!!).我在SO上发现了一些帖子,并决定下载Application Verifier和Debugging工具.我目前正在运行Visual Studio 2010.
所以,现在我已经安装了调试工具,我得到一个名为Windows Kits的文件夹.在文件夹中我有一个名为WinDbg的应用程序,我试图打开我的应用程序并运行它.它被罚款但我无法获得有关我的堆损坏的任何信息.然后我安装了验证器,它只给我留下了一个头文件和一个.dll文件,我不知道该怎么办.
所以,任何人都可以告诉我如何使用这个工具,这样我就不会再遭受这样的尴尬时刻了吗?一直在论坛上搜索,因为我甚至不知道如何打开验证器,当我阅读说明如何使用它时,我真的迷失了(从2009年开始)
我看到我可以在Visual Studio 2008中启动应用程序验证程序Debug->Start With Application Verifier.但是,app验证程序的文档显示了一系列可以配置的选项,如果它的UI是从Visual Studio单独启动的.我无法想象如何在Visual Studio中设置这些选项.
它变成了一种权衡.如果我从"调试"菜单启动应用程序验证程序,我会从应用程序验证程序获取有关执行中的缺陷的IDE集成响应.如果我在外部启动应用程序验证程序并配置特定选项,它仍然会在我的Visual Studio调试期间导致"停止",但是我没有得到IDE集成应用程序验证程序输出.
有谁知道如何访问app验证程序的配置功能,并且仍然具有VS完全集成的体验?
简单地说,我无法运行 App verifier(WOW 或 64 位)。它根本没有开始。事件查看器说:
错误的应用程序名称:appverif.exe,版本:10.0.18362.1,时间戳:0x58ca3409 错误的模块名称:ntdll.dll,版本:10.0.18362.1139,时间戳:0x335bbdaf 异常代码:0xc000003030000000000000 偏移量应用程序启动时间:0x01d6aa7ad4a12bf6 错误的应用程序路径:C:\Windows\SysWOW64\appverif.exe 错误的模块路径:C:\WINDOWS\SYSTEM32\ntdll.dll 报告 ID:235c3a4d-2d54-4436-99bf-b59a7f7f
此外,我尝试在 Visual Studio 下运行 appverif.exe(在系统和 syswow64 中),我看到:
编辑(根据评论更新)有些人建议应用程序验证程序没有 GUI。但是,上次运行它时,我看到了以下内容:
我已经安装了一些SDK的Microsoft Application Verifier.实际上我该如何使用它?有没有简单的例子/解释?
我想使用标准实用程序在我的应用程序中找到内存泄漏.以前我使用自己的内存分配器,但其他人(是的,你AlienFluid)建议使用微软的应用程序验证程序,但我似乎无法报告我的泄漏.我有以下简单的应用程序:
#include <iostream>
#include <conio.h>
class X
{
public:
X::X() : m_value(123) {}
private:
int m_value;
};
void main()
{
X *p1 = 0;
X *p2 = 0;
X *p3 = 0;
p1 = new X();
p2 = new X();
p3 = new X();
delete p1;
delete p3;
}
Run Code Online (Sandbox Code Playgroud)
此测试显然包含内存泄漏:p2是新的但未删除.
我使用以下命令行构建可执行文件:
cl /c /EHsc /Zi /Od /MDd test.cpp
link /debug test.obj
Run Code Online (Sandbox Code Playgroud)
我下载了Application Verifier(4.0.0665)并启用了所有检查.
如果我现在运行我的测试应用程序,我可以在Application Verifier中看到它的日志,但我没有看到内存泄漏.
问题:
如果我找不到合适的实用程序,我仍然需要依靠自己的内存管理器(完美地完成它).
我在Visual Studio 2010中的应用程序中安装了用于检测堆损坏的应用程序验证程序。它运行的操作系统是Windows7。我遇到的问题非常愚蠢:我无法启动应用程序验证程序。我读到它已安装在程序菜单中(但是我在那儿找不到应用程序验证程序),或者我只是运行AppVerif.exe(我也找不到)。在我的应用程序验证程序文件夹中,我只有REDIST.txt,vrfauto.dll,vrfauto.h和vrfauto.idl文件,而没有其他文件。我尝试再次卸载并重新安装它,但是该文件夹的内容保持不变,并且在我的计算机上没有AppVerif.exe的痕迹。在这一点上,我不知道该怎么办。我的应用程序卡住了,无法继续进行。请帮帮我!
我知道如何手动使用 AppVerif 和 windbg 来调试进程问题,但我正在组装一个自动化系统来运行一系列压力测试,而无需用户在场。
我需要一种方法来在 AppVerif 发现问题时生成进程转储,然后继续(假设这是一个非致命错误)。
有没有一种方法可以将 AppVerif 配置为正确地生成进程的转储而不是闯入,或者我是否必须附加 windbg 并以某种方式使其自动化以在中断时创建转储,然后继续。
我在Windows 10 17134上,并安装了Windows 10 SDK 16299。我实际上有一个较旧的Windows版本和4个不同版本的SDK,但决定升级到最新的Windows版本并卸载我所有的Win10 SDK,并仅安装我们在项目16299中使用的版本。团队中的一些人能够运行AppVerifier,但大多数不能。
我已经尝试将测试简化为使用基本测试将其简单地连接到Notepad.exe,这就是下面的样子。请注意,保存按钮显示为灰色,因为它确实已保存。如果不单击“保存”,则任何内容都不会生效。
然后,当我尝试直接运行notepad.exe时,出现以下错误:

这与我在项目中遇到的错误完全相同。现在仔细查看帮助文档,我发现:

好了,所以我在安装完整的Windows 10 SDK时拥有WinDbg。然后按照指南运行建议的命令行:
> C:\Program Files (x86)\Windows Kits\10\Debuggers\x86>windbg -xd av -xd
> ch -xd sov notepad.exe
Run Code Online (Sandbox Code Playgroud)
它使用以下输出启动WinDbg,该输出再次与我们项目的行为匹配: 
我承认,我以前从未使用过WinDbg,也不清楚应该怎么做。我的最初意图是诊断我的项目中的堆损坏。因此,希望有人可以解释为什么它适用于某些人而不适用于其他人,或者我做错了什么。谢谢!
同事将 32 位 C++ 应用程序转换为 64 位。出于测试目的,现在的想法是指示堆管理器仅返回 64 位范围内的地址。
\n\n在网上搜索解决方案似乎并没有给出非常可靠的结果:
\n\nMSDN 论坛VirtualAlloc()建议在 CRT 初始化之前使用。但是,我不明白为什么不应该返回指向高地址的指针,而将底部 4 GB 留空。
Raymond Chen 表示,Windows 7 有一个名为 的开关Allocation\xc2\xadPreference ,可以设置为MEM_TOP_DOWN。然而,这适用于整个系统,因此需要重新启动,这很不方便。(MSDN 上也有描述)。
我在应用程序验证器中进行了深入研究,并在堆条目的属性中发现了一些有趣的选项:
\n\n\n\n如您所见,我修改了SizeStart和SizeEnd以及AddrStart和AddrEnd。
\n\n很遗憾,
\n\n虽然地址高于输入的值,但堆的大小并未更改:
\n\nTermination on corruption : ENABLED\n Heap Flags Reserv Commit Virt Free List UCR Virt …Run Code Online (Sandbox Code Playgroud) 您知道用于托管应用程序的任何等效的 Microsoft Application Verifier 吗?
谢谢!