我想在Native C ++应用程序中在运行时访问调用堆栈。我没有使用IDE。如何显示调用堆栈?
更新:我有一个从应用程序的各个点调用的函数。它在极少数情况下崩溃。我正在寻找一种方法来获取调用者的名字并记录它。
答案 0 :(得分:3)
查看StackWalk64。
如果您习惯在.NET上执行此操作,那么您会遇到令人讨厌的惊喜。
答案 1 :(得分:1)
我相信this页面有您正在寻找的答案。你说Visual C所以我认为你的意思是windows。
答案 2 :(得分:1)
您应该考虑设置unhandled exception filter并从中编写一个minidump文件。它并不是那么复杂,而是well documented。 只需坚持您在未处理的异常过滤器中执行的最少操作(如果您有创意,请阅读all go wrong可以执行的操作)。
但是为了安全起见(你的未处理的异常过滤器可能会被无意中覆盖),你可以把你的代码放在__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和调试器都可以处理小型转储。
答案 3 :(得分:1)
如果你想获得崩溃的调用堆栈,你真正想做的是post mortem debugging。如果要在应用程序运行时检查应用程序的调用堆栈,这是SysInternals Process Explorer可以提供的众多函数之一。
答案 4 :(得分:0)
如果您没有主动调试,可以“崩溃”应用程序以生成小型转储(这可以非侵入性地完成并让应用程序继续运行)。 IIRC DrWatson会允许你这样做,如果不是来自MS支持的userdump会。
然后,您可以将转储加载到windbg中,并在那里查看callstack +变量等。您需要使用应用程序的符号来了解跟踪。
如果您正在寻找更简单的运行时代码样式跟踪,我建议您在每个方法上实例化一个简单的类,构造函数使用OutputDebugString编写方法名称。在程序运行时使用WinDebug查看跟踪。 (在你的类中加入某种形式的控件,即使它只是一个全局变量或注册表值,或全局Atom,这样你就可以随意打开或关闭跟踪)。
答案 5 :(得分:0)
在极少数情况下崩溃。我正在寻找一种方法来获取调用者的名字并记录它。
你崩溃的意思是什么?访问违规?除以零?到底是什么?它是否与内核模式组件交互?
启用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下执行此操作。