gpt4 book ai didi

c++ - 帮助事后调试混合模式 Win32 应用程序

转载 作者:行者123 更新时间:2023-11-30 01:32:58 24 4
gpt4 key购买 nike

情况是这样的:

背景

我有一个在 Visual Studio 2008 中开发的混合模式 .NET/Native 应用程序。

我所说的混合模式是指前端是用 C++ .NET 编写的,它会调用 native C++ 库。 native 代码完成应用程序中的大部分工作,包括根据需要启动新线程。 .NET 代码仅用于 UI 目的(win 表单)。

我有一个在测试人员计算机上运行的应用程序发布版本。

native 库在编译时进行了全面优化,但也启用了调试(“调试信息格式”设置为“程序数据库”)。

这意味着我在 PDB 文件中有应用程序的调试符号。

问题

所以无论如何,其中一位测试人员遇到了应用程序的问题,它偶尔会在 XP 上崩溃。我已经能够使用 Dr Watson 多次运行来获得崩溃的小型转储。

当我调试它时(使用小型转储——我实际上并没有调试真正的应用程序),所有调试符号都被正确加载:我可以正确地看到所有 native 线程的完整堆栈跟踪。其他线程(大概是 .NET 线程)没有堆栈跟踪,但它们至少向我展示了线程是在哪个 dll 上启动的(即 ntdll.dll)。

它正确地报告失败的线程(“用户 (5).dmp 中 0x0563d652 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000”。

但是,当我进入线程时,它显示没有任何用处。在堆栈跟踪中,有一个条目只有内存地址“0563d652()”(甚至不是“ntldll.dll”)。

当我进入 dissasembly 时,它只显示了大约 30 条指令的随机部分。内存地址的两边只是“???”。几乎看起来它不是我的源代码的一部分(你的二进制文件不是按顺序加载到内存中吗?在不知不觉中有一组随机的汇编语句是正常的吗?)。

我的问题

所以基本上我的问题是三重的。

1) 谁能解释调试器缺少信息的原因?

2) 请记住,我无法显示我的代码中发生的错误,任何人都可以提出失败的原因

3) 我可以做任何其他事情来帮助我在未来诊断当前的问题吗?

帮助!

约翰

更新:

这是来自 WinDBG 的失败线程的堆栈转储

 # ChildEBP RetAddr  
WARNING: Frame IP not in any known module. Following frames may be wrong.
00 099bf414 02d0e7fc 0x563d652
01 00000000 00000000 0x2d0e7fc

奇怪吧?甚至不显示 DLL。

是否有可能我以某种方式损坏了堆栈/堆,导致线程被损坏...?

最佳答案

您在使用 WinDbg 吗?如果是这样,您是否在使用 Son of strike 扩展程序?

Bugslayer: Son-of-Strike

-或-

Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects

关于c++ - 帮助事后调试混合模式 Win32 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/733948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com