错误时转储调用堆栈? 我调试了一个用C语言编写的程序(无C++,MFC,.NET等)到Win32 API。它必须在VS2005(在Win 2K/XP下运行)和VS2010(在Win7下运行)中编译。我无法复制一个我的客户似乎能够相当可靠地复制的错误,因此我正在寻找让我的程序“自行调试”的方法。它监视所有正在更改的键值,但我真正希望看到的是当值更改时堆栈转储。哦,如果不在客户的机器上安装编译器,我就无法运行“真正的”调试构建(使用调试库),这不是一个选项,因此必须将其构建到我的发布构建中

错误时转储调用堆栈? 我调试了一个用C语言编写的程序(无C++,MFC,.NET等)到Win32 API。它必须在VS2005(在Win 2K/XP下运行)和VS2010(在Win7下运行)中编译。我无法复制一个我的客户似乎能够相当可靠地复制的错误,因此我正在寻找让我的程序“自行调试”的方法。它监视所有正在更改的键值,但我真正希望看到的是当值更改时堆栈转储。哦,如果不在客户的机器上安装编译器,我就无法运行“真正的”调试构建(使用调试库),这不是一个选项,因此必须将其构建到我的发布构建中,c,windows,winapi,C,Windows,Winapi,除了将我自己的函数入口/出口调用添加到我自己的堆栈监视器之外,还有其他方法可以做到这一点吗?我特别希望能够在特定内存地址意外更改时设置硬件断点(因此我需要能够在少数预期更改位置周围禁用/启用它)。这可能吗?在Windows程序中 如果可能的话,我更喜欢不需要修改几千行代码的东西。是的,当涉及到开发工具时,我是非常贫困的——我认为自己有幸拥有Visual Studio IDE的专业版。 --编辑-- 除了下面提供的优秀答案之外,我还发现了一些关于在您自己的代码中使用硬件断点的信息。我认为它是为了攻

除了将我自己的函数入口/出口调用添加到我自己的堆栈监视器之外,还有其他方法可以做到这一点吗?我特别希望能够在特定内存地址意外更改时设置硬件断点(因此我需要能够在少数预期更改位置周围禁用/启用它)。这可能吗?在Windows程序中

如果可能的话,我更喜欢不需要修改几千行代码的东西。是的,当涉及到开发工具时,我是非常贫困的——我认为自己有幸拥有Visual Studio IDE的专业版。 --编辑--
除了下面提供的优秀答案之外,我还发现了一些关于在您自己的代码中使用硬件断点的信息。我认为它是为了攻击其他程序而写的,但它看起来可能适合我的需要,允许我在意外位置写入变量时创建一个小型转储。这将是非常酷和非常有用的,特别是如果我能概括它的话。谢谢你的回答,现在我要去看看我能用这些新信息创建什么

dbghelp32.dll中有一组Win32函数可用于为给定线程生成堆栈跟踪:有关此函数的示例,请参阅

您还可以在MSDN上查找StackWalk64()和相关函数

为了获得有用的信息,您应该在编译器中为发布版本启用PDB文件生成:如果您设置了安装程序,以便在客户的计算机上PDB文件与DLL位于同一位置,那么您可以获得带有函数名等的可理解堆栈跟踪,您只需要获取函数的DLL名称和十六进制地址


我不确定设置硬件断点有多实际:您可以编写某种使用Win32调试API的调试器,但这可能比它的价值更麻烦。

dbghelp32.dll中有一组Win32函数可用于为给定线程生成堆栈跟踪:有关此示例,请参阅

您还可以在MSDN上查找StackWalk64()和相关函数

为了获得有用的信息,您应该在编译器中为发布版本启用PDB文件生成:如果您设置了安装程序,以便在客户的计算机上PDB文件与DLL位于同一位置,那么您可以获得带有函数名等的可理解堆栈跟踪,您只需要获取函数的DLL名称和十六进制地址


我不确定设置硬件断点有多实际:您可以编写某种使用Win32调试API的调试器,但这可能比它的价值更麻烦。

您可以使用
MiniDumpWriteDump
函数创建转储,用于事后调试。在应用程序崩溃的情况下,您可以从
SetUnhandledExceptionFilter
设置的未处理异常处理程序调用
minidumpWriteDomainp
。如果您正在谈论的bug不是崩溃,那么当检测到一些意外情况时,您可以从程序的任何位置调用
MiniDumpWriteDump
。有关崩溃转储和事后调试的更多信息,请参见此处:


该技术的主要思想是将客户端站点上生成的迷你转储文件发送给开发人员,可以对其进行调试-线程、堆栈和变量信息可用(代码优化会造成明显的限制)。

您可以使用创建转储的
迷你转储writedump
函数,可用于事后调试。在应用程序崩溃的情况下,您可以从
SetUnhandledExceptionFilter
设置的未处理异常处理程序调用
minidumpWriteDomainp
。如果您正在谈论的bug不是崩溃,那么当检测到一些意外情况时,您可以从程序的任何位置调用
MiniDumpWriteDump
。有关崩溃转储和事后调试的更多信息,请参见此处:


这种技术的主要思想是将客户端站点上生成的迷你转储文件发送给开发人员,可以对其进行调试—线程、堆栈和变量信息可用(代码优化会造成明显的限制).

如果您可以添加limited指令插入以在症状复发时引发可识别的异常,则可以使用在该异常的任何实例上生成完整进程转储


我发现我经常引用这个工具,它对于难以调试的生产问题来说真是天赐良机,但似乎鲜为人知。

如果您可以添加有限的工具,在症状复发时引发可识别的异常,您可以使用它在该异常的任何实例上生成完整的进程转储


我发现我经常引用这个工具,它对于难以调试的生产问题来说真是天赐良机,但似乎鲜为人知。

Offtopic:如果你不能复制它,而客户可以,那么很可能是他们这边的一些配置。@m0skit0这是毫无根据的assumption@m0skit0客户的机器有我不能使用的硬件,因为它是监控发电厂铀燃料预处理系统的一部分。他们不让我在办公室里拥有这些东西,我发现自己无法很好地模拟它