运行时调用堆栈

问题描述 投票:0回答:6

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

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

c++ debugging visual-c++ stack-trace callstack
6个回答
3
投票

看看StackWalk64

如果您习惯在 .NET 上执行此操作,那么您将会遇到一个令人讨厌的意外。


1
投票

我相信这个页面有您正在寻找的答案。你说的是 Visual C,所以我假设你指的是 Windows。


1
投票

您应该考虑设置未处理的异常过滤器并从其中写入小型转储文件。它并不那么复杂,并且有“详细记录”。 只需坚持在未处理的异常过滤器中执行一次最少的操作即可(如果您有创意,请阅读什么可能全部出错)。 但为了安全起见(未处理的异常过滤器可能会被无意中覆盖),您可以将代码放入 __try/__ except 块中,并从过滤器函数中写入小型转储(注意,您不能将需要自动展开的对象放在带有 __try/__ except 块的函数,如果你有它们,请考虑将它们放入单独的函数中):

长 __stdcall myfilter(EXCEPTION_POINTERS *pexcept_info)

{
mycreateminidump(p except_info);
返回 EXCEPTION_EXECUTE_HANDLER;
}
无效 myfunc()
{
__尝试{
//你的逻辑在这里
} __except(myfilter(GetExceptionInformation())) {
// 异常处理
}
}


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


1
投票
事后调试

。如果您想在应用程序运行时检查应用程序的调用堆栈,这是 SysInternals Process Explorer 可以提供的众多功能之一。


0
投票

然后您可以将转储加载到 Windbg 中并在那里查看调用堆栈+变量等。您将需要应用程序的符号来理解跟踪。

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


0
投票
它在极少数情况下会崩溃。我正在寻找一种方法来获取呼叫者的姓名并记录下来。

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

打开应用程序验证器。这应该可以消除很多事情。

创建这个:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.