我想在本机 C++ 应用程序中在运行时访问调用堆栈。我没有使用 IDE。如何显示调用堆栈?
更新:我有一个从整个应用程序的许多点调用的函数。它在极少数情况下崩溃。我正在寻找一种方法来获取呼叫者的姓名并将其记录下来。
我想在本机 C++ 应用程序中在运行时访问调用堆栈。我没有使用 IDE。如何显示调用堆栈?
更新:我有一个从整个应用程序的许多点调用的函数。它在极少数情况下崩溃。我正在寻找一种方法来获取呼叫者的姓名并将其记录下来。
看看StackWalk64。
如果您习惯于在 .NET 上执行此操作,那么您会大吃一惊。
我相信这个页面有你正在寻找的答案。您说的是 Visual C,所以我假设您的意思是 windows。
您应该考虑设置未处理的异常过滤器并在其中编写一个小型转储文件。它并不是那么复杂,并且有据可查。只需坚持在未处理的异常过滤器中执行的最少操作(如果您有创意, 请阅读所有可能出错的内容)。
但为了安全起见(您的未处理异常过滤器可能会无意中被覆盖),您可以将代码放在 __try/__except 块中并从过滤器函数中编写小型转储(注意,您不能有需要自动展开的对象)带有 __try/__except 块的函数,如果有,请考虑将它们放入单独的函数中):
长 __stdcall myfilter(EXCEPTION_POINTERS *pexcept_info)
{
mycreateminidump(pexcept_info);
返回 EXCEPTION_EXECUTE_HANDLER;
}
void myfunc()
{
__try{
//你的逻辑在这里
} __except(myfilter(GetExceptionInformation())) {
// 异常处理
}
}
然后,您可以使用您选择的调试器检查转储文件。Visual Studio 和 Windows 调试工具包中的调试器都可以处理小型转储。
如果你想获得崩溃的调用堆栈,你真正想做的是事后调试。如果您想在应用程序运行时检查它的调用堆栈,这是SysInternals Process Explorer可以提供的众多功能之一。
如果您没有积极调试,您可以“崩溃”应用程序以生成小型转储(这可以非侵入性地完成并让应用程序继续运行)。IIRC DrWatson 会让你这样做,如果不是来自 MS 支持的 userdump。
然后,您可以将转储加载到 windbg 并在那里查看调用堆栈 + 变量等。您将需要应用程序的符号来理解跟踪。
如果您正在寻找更简单的运行时代码样式跟踪,我建议您在每个方法上实例化一个简单的类,构造函数使用 OutputDebugString 写入方法名称。使用 WinDebug 在程序运行时查看跟踪。(在您的类中放置某种形式的控制,即使它只是一个全局变量或注册表值,或全局 Atom,以便您可以随意打开或关闭跟踪)。
它在极少数情况下崩溃。我正在寻找一种方法来获取呼叫者的姓名并将其记录下来。
你说它崩溃是什么意思?访问冲突?除以零?究竟是什么?它是否与内核模式组件交互?
打开appverifier。那应该消除很多东西。
创建这个:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\FileName.exe
在该键下,创建一个新的字符串名称:调试器值:c:\pathtowindbg\windbg.exe -gG -xe av
如果您使用 WOW 运行 32 位代码,则需要在 wow3264 节点下执行此操作。