我想在运行时访问调用堆栈在本地C ++应用程序。 我不使用的IDE。 如何显示调用堆栈?
更新:我有一个是从许多点叫遍应用功能。 它崩溃在罕见的情况。 我一直在寻找一种方式来获得主叫方的姓名和记录它。
我想在运行时访问调用堆栈在本地C ++应用程序。 我不使用的IDE。 如何显示调用堆栈?
更新:我有一个是从许多点叫遍应用功能。 它崩溃在罕见的情况。 我一直在寻找一种方式来获得主叫方的姓名和记录它。
我认为, 这个页面有你正在寻找的答案。 你说的Visual C所以我假设你的意思是窗户。
看一看StackWalk64 。
如果你使用的.NET这样做,那么你在一个讨厌的惊喜。
你应该考虑设置你的未处理的异常过滤器 ,从内部将其写入一个小型转储文件。 这是不是所有的复杂,是有据可查的 。 只要坚持到最低限度你在未处理的异常过滤器做一次的事情(读什么可以都去错了 ,如果你的创意)。
但是为了安全起见(你的未处理的异常过滤器可能会在不经意间改写),你可以把你的代码中__try / __ except块和写入转储从过滤器功能音符中(,你不能有需要在自动平仓对象与除块__try / __功能,如果你有他们,可以考虑将它们放入一个单独的函数):
长__stdcall myfilter(EXCEPTION_POINTERS * pexcept_info)
{
mycreateminidump(pexcept_info);
返回EXCEPTION_EXECUTE_HANDLER;
}
无效MYFUNC()
{
__尝试{
//你这里的逻辑
} __except(myfilter(GetExceptionInformation())){
//异常处理
}
}
然后,您可以与您所选择的调试器检查转储文件。 Visual Studio和调试器从Windows调试工具包可以处理小型转储。
如果你想获得坠毁的调用堆栈,你真正想要做的是验尸调试 。 如果您要检查它运行时应用程序的调用堆栈,这是众多功能之一Sysinternals的进程资源管理器可以提供。
如果你不积极调试,你可以“撞车”的应用程序产生转储(这是可以做到无创,并让应用程序继续运行)。 IIRC DrWatson将让你这样做,如果不从MS支持将用户转储。
然后,您可以转储加载到WinDbg中,看到了调用堆栈变量+等在那里。 你需要你的应用程序的符号,以跟踪的感觉。
如果你正在寻找一个简单的运行时代码风格的痕迹,我建议您在每一个方法实例化一个简单的类,构造函数写使用OutputDebugString的方法名。 使用WinDebug在程序运行时查看跟踪。 (把某种形式的控制,在你的班上,哪怕它只是一个全局变量或注册表值,或全局Atom这样你就可以打开跟踪或关闭随意)。
它崩溃在罕见的情况。 我一直在寻找一种方式来获得主叫方的姓名和记录它。
你是什么意思它崩溃? 访问冲突? 除以零? 究竟是什么? 是否有内核模式组件进行交互?
打开AppVerifier的。 这样可以消除很多东西。
创建这个:
HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows NT \ CURRENTVERSION \图像文件执行选项\ FILENAME.EXE
该键下新建一个字符串名称:调试值:C:\ pathtowindbg \ WINDBG.EXE -GG -xe AV
如果您正在运行的32位WOW代码,你需要做的这个wow3264node下。