调用堆栈在运行时(Call Stack at Runtime)

2019-08-01 01:24发布

我想在运行时访问调用堆栈在本地C ++应用程序。 我不使用的IDE。 如何显示调用堆栈?

更新:我有一个是从许多点叫遍应用功能。 它崩溃在罕见的情况。 我一直在寻找一种方式来获得主叫方的姓名和记录它。

Answer 1:

我认为, 这个页面有你正在寻找的答案。 你说的Visual C所以我假设你的意思是窗户。



Answer 2:

看一看StackWalk64 。

如果你使用的.NET这样做,那么你在一个讨厌的惊喜。



Answer 3:

你应该考虑设置你的未处理的异常过滤器 ,从内部将其写入一个小型转储文件。 这是不是所有的复杂,是有据可查的 。 只要坚持到最低限度你在未处理的异常过滤器做一次的事情(读什么可以都去错了 ,如果你的创意)。

但是为了安全起见(你的未处理的异常过滤器可能会在不经意间改写),你可以把你的代码中__try / __ except块和写入转储从过滤器功能音符中(,你不能有需要在自动平仓对象与除块__try / __功能,如果你有他们,可以考虑将它们放入一个单独的函数):

长__stdcall myfilter(EXCEPTION_POINTERS * pexcept_info)
{
mycreateminidump(pexcept_info);
返回EXCEPTION_EXECUTE_HANDLER;
}
无效MYFUNC()
{
__尝试{
//你这里的逻辑
} __except(myfilter(GetExceptionInformation())){
//异常处理
}
}

然后,您可以与您所选择的调试器检查转储文件。 Visual Studio和调试器从Windows调试工具包可以处理小型转储。



Answer 4:

如果你想获得坠毁的调用堆栈,你真正想要做的是验尸调试 。 如果您要检查它运行时应用程序的调用堆栈,这是众多功能之一Sysinternals的进程资源管理器可以提供。



Answer 5:

如果你不积极调试,你可以“撞车”的应用程序产生转储(这是可以做到无创,并让应用程序继续运行)。 IIRC DrWatson将让你这样做,如果不从MS支持将用户转储。

然后,您可以转储加载到WinDbg中,看到了调用堆栈变量+等在那里。 你需要你的应用程序的符号,以跟踪的感觉。

如果你正在寻找一个简单的运行时代码风格的痕迹,我建议您在每一个方法实例化一个简单的类,构造函数写使用OutputDebugString的方法名。 使用WinDebug在程序运行时查看跟踪。 (把某种形式的控制,在你的班上,哪怕它只是一个全局变量或注册表值,或全局Atom这样你就可以打开跟踪或关闭随意)。



Answer 6:

它崩溃在罕见的情况。 我一直在寻找一种方式来获得主叫方的姓名和记录它。

你是什​​么意思它崩溃? 访问冲突? 除以零? 究竟是什么? 是否有内核模式组件进行交互?

打开AppVerifier的。 这样可以消除很多东西。

创建这个:

HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows NT \ CURRENTVERSION \图像文件执行选项\ FILENAME.EXE

该键下新建一个字符串名称:调试值:C:\ pathtowindbg \ WINDBG.EXE -GG -xe AV

如果您正在运行的32位WOW代码,你需要做的这个wow3264node下。



文章来源: Call Stack at Runtime