English 中文(简体)
运行时调用堆栈
原标题:
  • 时间:2008-09-24 10:48:03
  •  标签:

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

更新:我有一个函数,它是从整个应用程序的多个点调用的。它很少会崩溃。我一直在寻找一种方法来获取来电者的姓名并将其记录下来。

最佳回答

我相信这个页面有你正在寻找的答案。你说的是Visual C,所以我认为你指的是windows。

问题回答

看看StackWalk64

如果你已经习惯了在.NET上这样做,那么你会大吃一惊。

You should consider setting your unhandled exception filter and writing a minidump file from within it. It is not all that complicated and is well documented. Just stick to the minimum of things you do once in your unhandled exception filter (read what can all go wrong if you get creative).

但为了安全起见(您未处理的异常筛选器可能会被无意中覆盖),您可以将代码放在__try/_except块中,并从筛选器函数中写入小型转储(注意,在带有__try/_ except的函数中不能有需要自动展开的对象,如果有,请考虑将它们放在一个单独的函数中):

long __stdcall myfilter(EXCEPTION_POINTERS *pexcept_info)
{
    mycreateminidump(pexcept_info);
    return EXCEPTION_EXECUTE_HANDLER;
}
void myfunc()
{
__try{
    //your logic here
} __except(myfilter(GetExceptionInformation())) {
    // exception handled
}
}

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

如果你想获得崩溃的调用堆栈,你真正想做的是死后调试。如果您想在应用程序运行时检查其调用堆栈,这是众多函数之一SysInternal Process Explorer可以提供。

如果你没有主动调试,你可以“崩溃”应用程序以产生一个小型转储(这可以非侵入性地完成,并让应用程序继续运行)。IIRC DrWatson会让你这样做,如果没有,MS支持的用户转储会。

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

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

它很少会崩溃。我一直在寻找一种方法来获取来电者的姓名并将其记录下来。

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

打开appverifier。这应该会消除很多东西。

创建此:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersion映像文件执行选项FileName.exe

under that key, create a new string name : debugger value: c:pathtowindbgwindbg.exe -gG -xe av

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





相关问题
热门标签