我制作的应用程序存在一个问题,该应用程序有时会因某些 .NET 代码中的 StackOverflowException 而崩溃。
不幸的是,该应用程序部分是非托管的,部分是托管的,并且由于某种原因,该问题仅出现在非开发人员的机器上。
我目前的计划是使用 WINDBG(微软的 Windows 调试工具的一部分),安装在测试人员的机器上,我可以让 WINDBG 捕获相关异常的创建。
因此,我可以执行以下操作:
sxe ld:mscorlib
g
.loadby sos clr
!stoponexception -create System.StackOverflowException
g
不幸的是,由于这个问题每隔一天才会出现一次,而且每执行 50 次左右才会出现一次,我宁愿避免测试人员每次启动这个应用程序时都要输入全部或部分内容。
我尝试将上述命令放在文本文件中,并为它们创建了一个快捷方式,如下所示:
"...\windbg.exe" -c "$<c:\windbg.txt" -o "...\app.exe"
这将启动 WINDBG 调试器,但不幸的是失败并出现以下错误消息:
0:000> sxe ld:mscorlib
0:000> g
Command file caused an implicit wait
Command file execution failed, HRESULT 0x80004005
"Unspecified error"
所以显然,g
这样的启动脚本是不允许的。
我能做到我想做的事吗?我可以自动执行此操作吗,还是我只需要准备一个批处理文件或使用 autohotkey 执行此操作的文件?
答案1
虽然已经很晚了,但我还是想提供一个解决方法。我也遇到过同样的问题,在寻找答案时偶然发现了这个问题。后来我找到了一种解决方法。
解决方法是使用 $>< 或 $$>< 或 $$>a< 调用脚本,以便将命令压缩为单个命令块。
答案2
您可以尝试一下.dump /ma /u c:\app.dmp
,以便获得可以在您的机器上复制和分析的崩溃转储。
但是,您无需让用户在其计算机上运行 WinDbg,而是可以使用 WER 自动获取崩溃转储,将其复制到您的计算机上,然后在没有时间压力的情况下进行分析。请参阅收集用户模式转储在注册表中创建将转储存储在磁盘上的设置。
在这两种情况下,您都应该从 C:\Windows\Microsoft.NET\Framework\v4.0.30319 (或 Framework64)复制:
否则可能会发生你的.NET版本与他的版本不同而你无法分析错误的情况。