- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的应用程序中某处出现了 StackOverFlow - 我正试图找到追踪它的方法。
我的事件日志每天都会显示一次崩溃,并包含以下信息:
Faulting application name: MyApp.exe, version: 1.0.0.0, time stamp: 0x522e8317
Faulting module name: clr.dll, version: 4.0.30319.18047, time stamp: 0x515530ce
Exception code: 0xc00000fd
Fault offset: 0x000000000000c657
Faulting process id: 0x117fc
Faulting application start time: 0x01ceadf607b184d2
Faulting application path: C:\Users\Administrator\Desktop\MyApp.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Report Id: d52424aa-1a16-11e3-bc4b-002590a4ec55
我读到 0xc00000fd 是一个堆栈溢出,但我不确定它可能发生在哪里(非常大的代码库),以及如何追踪它。有什么想法吗?
最佳答案
这通常是我使用 WinDbg 追踪的东西,否则它只是一个猜谜游戏。下面是一个快速演练,可以让您朝着正确的方向前进。
WinDbg 是 Windows 的调试器,适用于调试托管和非托管代码。它也非常适合检查故障转储。让我们从示例程序开始。
class Program
{
static void Main(string[] args)
{
IWillStackOverflow(0);
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
static int IWillStackOverflow(int i)
{
return IWillStackOverflow(i + 1);
}
}
这是一个非常人为的例子,但让我们开始吧。它确实堆栈溢出,也不提供堆栈跟踪。这就是 WinDbg 的用武之地。首先您需要安装它,它是 Windows SDK 中调试工具的一部分。 .有两个版本,x64 和 x86。您需要运行与您的应用程序的位数匹配的那个。
在 WinDbg 中,使用 File -> Open Executable 并运行附加了 WinDbg 的可执行文件。调试器将在您的应用程序加载后立即中断,您可以使用 g
命令转到并使用您的应用程序,直到出现 StackOverflowException。不过,在你这样做之前,请确保你的符号是正确的——通常运行 .symfix+
会更正它,然后你就可以走了。
当您收到 StackOverflowException 时,调试器将在引发异常的线程上中断,消息将如下所示:
(cc0.b00): Stack overflow - code c00000fd (first chance)
现在我们可以使用此命令加载托管调试扩展(我假设您在这里使用的是 .NET Framework 4.0 或 4.5):
.loadby sos clr
并调用 !clrstack
。在这个例子中,输出是:
000000d440c76040 00007ffb282b0111 StackOverflower.Program.IWillStackOverflow(Int32) [Program.cs @ 20]
000000d440c76080 00007ffb282b0111 StackOverflower.Program.IWillStackOverflow(Int32) [Program.cs @ 20]
000000d440c760c0 00007ffb282b0111 StackOverflower.Program.IWillStackOverflow(Int32) [Program.cs @ 20]
..Repeat thousands of times..
所以我们在发生 StackOverflowException 时拥有我们的托管堆栈。
如果您的应用程序不太容易 StackOverflow,您可以配置 ADPlus在发生 StackOverflowException 时获取应用程序的内存转储。 ADPlus 是另一个强大的工具,但它很有效。首先你需要一个 ADPlus 的配置,这里是一个例子:
<ADPlus>
<!-- Add log entry, log faulting thread stack and dump full on first chance StackOverflow -->
<Exceptions>
<Config>
<!-- Use sov for stack overflow exception -->
<Code> sov </Code>
<Actions1> Log;Stack;FullDump </Actions1>
<!-- Depending on what you intend - either stop the debugger (Q or QQ) or continue unhandled (GN) -->
<ReturnAction1> GN </ReturnAction1>
< Config>
</Exceptions>
</ADPlus>
此配置示例最初由用户 jaskis 在 MSDN 论坛上发布:http://blogs.msdn.com/b/jaskis/archive/2010/08/11/cwa-ends-up-with-blank-screen-on-browser-on-iis-7.aspx然后使用命令行启动带有配置的应用程序。
这只是一个例子,WinDbg 是一个非常强大的工具,尽管它有一点学习曲线。互联网上有很多很好的资源可以帮助你掌握它。 Tess Ferrandez她的博客中有许多文章介绍了 WinDbg 和托管调试扩展。
关于c# - 如何在我的应用程序中找到 StackOverflowException 的来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18721841/
我正在用 robocopy 编写一个 powershell 脚本来从列表中复制“完整的”unc/文件名路径。我遇到的问题是 robocopy 似乎在我的源路径末尾添加了一个 \。 我有一个 C:\te
我发现守护程序通过这些代码创建了一个容器 // NewBaseContainer creates a new container with its // basic configuration. fu
是否有所有潜在 map 源的列表?在示例页面上,可以浏览四种类型的 map 。外面还有什么? http://tombatossals.github.io/angular-leaflet-directi
是否有所有潜在 map 源的列表?在示例页面上,可以浏览四种类型的 map 。外面还有什么? http://tombatossals.github.io/angular-leaflet-directi
我们的网站比较多,第一次使用ElasticSearch不知道应该怎么配置ES: 我们想使用 ES 作为这些网站的唯一搜索引擎,我们是否应该为每个网站设置单独的 ES 实例? (我想这可能比一个 ES
我需要一些关于我对 UNI 项目的想法的建议。 我想知道是否可以将一个音频文件从不同的音频源分成不同的“流”。例如,将音频文件拆分为:引擎噪音、火车噪音、人声、并非始终存在的不同声音等。 我不一定需要
我想设置“公共(public)彩票”,每个人都可以看到选择是随机和公平的。如果我只需要一点,我会使用例如当天收盘道琼斯指数的 LSB。问题是,我需要 32 位。我需要一个来源: 每日可用 全世界都可以
来自 pickle 的 python 文档: Warning The pickle module is not secure. Only unpickle data you trust. 什么是 pi
我试图安排一个 liquidsoap 流媒体源在未来的特定日期和时间播放。我相信这可以使用 Liquidsoap switch 命令来完成,但我无法理解此处描述的文档:http://liquidsoa
对于Shiny应用程序,我希望能够播放在 session 本身期间生成的音频文件。 如果它是我要上传的音频文件,我将使用 tags$audio(src = "www/name.wav", ty
我想更改我的 OpenGL 来源。图片会说明: 现在是这样的: 这就是我想要的: 当前代码 gl.glViewport(0, 0, width, height); gl.glMatrixMode(GL
我正在尝试让 Stripe 运行起来,我几乎已经完成了,但有一件令人困惑的事情。 source: 'tok_visa' 部分。看起来它可以是“tok_mastercard”、“bank_account
我已经下载了 primefaces 源代码,看看是否可以从中学习。该 jar 包含一堆使用编写器来处理渲染等的 java 类。我期待找到一些 .xhtml 文件 ... and etc etc
如果我查看页面源代码,我会看到 styling += 'ul#topnav a.tabHeader5'; styling += '{'
我正在尝试根据显示器的大小更改背景图像。它不在服务器上运行。您可以在 https://github.com/Umpalompa/Umpalompa.github.io 找到我的所有代码. 我尝试同时使
从here的最底部开始.有一个 URL 生成器,我可以使用引荐来源网址在 Google Play 上生成指向我的应用程序的链接。我如何从谷歌分析中提取该 Activity 来源?我一直在谷歌上搜索,但
我用 Google Weather API 制作了一个插件,目前我正在从 Google 的 API 中提取图像。对于晴天,我正在拉 http://www.google.com//ig/images/w
是否可以通过环境变量为 @CrossOrigin 注释指定来源?我想这样做,以便我可以将相同的代码库用于 uat/staging/production。我希望我的 uat/staging 环境可以通过
我需要等待我的 JavaScript 中的文档准备就绪,才能在正文底部插入一个 div。 我想: 使此 JavaScript 文件尽可能小(如果可能,将其编译到 < 1kb) 在闭包中内联提供文档就绪
我正在开发电子邮件服务并想连接到谷歌帐户,是否可以将我的本地主机用作授权的 JavaScript 来源? 最佳答案 第 1 步:启用 Google+ API http://localhost:4567
我是一名优秀的程序员,十分优秀!