Debugging 运行时调用堆栈

Debugging 运行时调用堆栈,debugging,visual-c++,callstack,Debugging,Visual C++,Callstack,我想在本地C++应用程序中运行时调用堆栈。我没有使用IDE。如何显示调用堆栈 更新:我有一个函数,它在整个应用程序的许多地方都被调用。它偶尔会崩溃。我正在寻找一种方法来获取来电者的姓名并将其记录下来。请查看 如果您习惯于在.NET上执行此操作,那么您将面临一个严重的惊喜。如果您没有积极调试,您可以“崩溃”应用程序以生成一个小型转储(这可以以非侵入性方式完成,并让应用程序继续运行)。IIRC DrWatson将允许您这样做,如果不是,MS支持的userdump将允许您这样做 然后,您可以将转储加载

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

更新:我有一个函数,它在整个应用程序的许多地方都被调用。它偶尔会崩溃。我正在寻找一种方法来获取来电者的姓名并将其记录下来。

请查看


如果您习惯于在.NET上执行此操作,那么您将面临一个严重的惊喜。

如果您没有积极调试,您可以“崩溃”应用程序以生成一个小型转储(这可以以非侵入性方式完成,并让应用程序继续运行)。IIRC DrWatson将允许您这样做,如果不是,MS支持的userdump将允许您这样做

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


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

我相信该页面已经找到了您想要的答案。你说VisualC,所以我假设你是WINDOWS。

< P>你应该考虑从里面设置和写一个MINIDUMP文件。这并不是那么复杂,而且很复杂。 只需在未处理的异常过滤器中执行最少的一次操作(如果有创意,请阅读所能阅读的内容)。

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

long\u stdcall myfilter(异常指针*异常信息)
{
mycreateminidump(PEExcept_信息);
返回异常\u执行\u处理程序;
}
void myfunc()
{
__试试{
//您的逻辑在此
}除了(myfilter(GetExceptionInformation()){
//已处理异常
}
}
然后,您可以使用自己选择的调试器检查转储文件。Visual Studio和Windows调试工具包中的调试器都可以处理小型转储

它偶尔会崩溃。我正在寻找一种方法来获取呼叫者的名字并记录它

它崩溃是什么意思?访问冲突?被零除?具体是什么意思?它与内核模式组件交互吗

打开appverifier。这将消除很多问题

创建以下内容:

HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\FileName.exe

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


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

如果您想要获取崩溃的调用堆栈,您真正想要做的是。如果您想要在应用程序运行时检查其调用堆栈,这是许多功能之一