我想在Native C ++应用程序中在运行时访问调用堆栈。我没有使用IDE。如何显示调用堆栈?

更新:我有一个从应用程序的各个点调用的函数。它在极少数情况下崩溃。我正在寻找一种方法来获取调用者的名字并记录它。

有帮助吗?

解决方案

我相信这个页面有你想要的答案。你说Visual C所以我认为你的意思是windows。

其他提示

查看 StackWalk64

如果您习惯在.NET上执行此操作,那么您会遇到令人讨厌的惊喜。

您应该考虑设置未处理的异常过滤器并编写内部的minidump文件。它并不是那么复杂,并且记录良好。 只需坚持您在未处理的异常过滤器中执行的最少操作(阅读所有出错的内容如果你有创意的话)。

但是为了安全起见(你的未处理异常过滤器可能会被无意中覆盖),你可以把你的代码放在__try / __除了块之外并从过滤器函数中写入minidump(注意,你不能有需要自动的对象)在__try / __除块之外的函数中展开,如果你有,请考虑将它们放入一个单独的函数中):

long __stdcall myfilter(EXCEPTION_POINTERS * pexcept_info)
{点击      mycreateminidump(pexcept_info);结果     返回EXCEPTION_EXECUTE_HANDLER;
}结果 void myfunc()
{点击 __try {点击      //您的逻辑在这里
} __except(myfilter(GetExceptionInformation())){
     //异常处理
}结果 }结果

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

如果你想获得崩溃的问题,你真正想做的是事后调试。如果你想在运行时检查一个应用程序的callstack,这是许多函数之一 SysInternals Process Explorer 可以提供。

如果你没有主动调试,你可以“崩溃”。用于生成minidump的应用程序(这可以非侵入性地完成并让应用程序继续运行)。 IIRC DrWatson会允许你这样做,如果不是来自MS支持的userdump会。

然后,您可以将转储加载到windbg中,并在那里查看callstack +变量等。您需要使用应用程序的符号来了解跟踪。

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

  

在极少数情况下崩溃。我正在寻找一种方法来获取调用者的名字并记录它。

你崩溃的意思是什么?访问违规?除以零?到底是什么?它是否与内核模式组件交互?

启用appverifier。这应该消除很多东西。

创建:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Image File Execution Options \ FileName.exe

在该键下,创建一个新字符串 name:调试器 值:c:\ pathtowindbg \ windbg.exe -gG -xe av

如果您使用WOW运行32位代码,则需要在wow3264node下执行此操作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top