我编写(和销售)的软件在分发之前已经过压缩和加密.每次我发布一个新版本时,我会保留所有的.map文件和生成的二进制文件,包括压缩和加密之前的exe文件.
当它在客户端的机器上崩溃时,我会得到一个minidump.我在Visual Studio中打开这些minidump并在那里探索它们.
我通过在.map文件中搜索地址来充分利用这些小型转储.这通常会让我进入代码的正确区域,我通常可以解释为什么崩溃发生并修复它,但这非常耗时.
如果我可以在minidump的调试中使用我从原始构建中保存的符号,将会很有帮助.
我的问题是我收到有关无法找到正确符号的警告.我的研究让我相信这是因为客户机上的exe的校验和与Visual Studio构建的exe的校验和不匹配.我理解为什么,它已被压缩和加密.当然校验和不匹配.
我想我可以手动编辑minidump或更改已保存二进制文件的校验和以匹配可分发的校验和.我宁愿操纵存储的副本,所以我不必修改进来的每个转储,但我会对其中任何一个进行修改.
所以,我的问题是:我如何找到这些校验和并弄清楚我应该用它们替换它们?作为辅助问题:有更好的方法吗?
如MSDN所述,我设置了注册表项HKLM \ SOFTWARE \ Microsoft \ Windows \ Windows错误报告\ LocalDumps 。
我有一个测试程序-一个用Visual C ++编译的控制台程序,该程序尝试在打印消息并退出之前取消引用NULL指针。该测试程序曾经用于退出和转储核心文件,但现在它刚刚退出。我没有核心。
我在物理硬件上运行Windows Server 2008 R2 Enterprise SP1。
我不知道发生了什么变化。有什么变化可以阻止WER现在转储内核?
我刚刚安装了Google Chrome并开始检查我的网络应用程序.由于我在HTML或Javascript中都有一个错误,我在要调用的函数中设置了一个断点...或者至少我认为自从在左侧栏上双击并且行号没有显示蓝色图标.现在一切都冻结了,过了一会儿我收到错误消息"哦没有",并且Sources下的js文件中的代码不再显示了.我必须关闭该死的浏览器.
Sources下工具右侧的多个选项不显示任何断点,既不是活动的也不是非活动的.资源在我的应用程序中显示带有JS文件的树,但是当我双击任何文件时,我看不到代码.
我的断点是否有效?怎么解决这个?
PS - 只有在我调用开发人员工具时,应用程序才会冻结并导致短暂转储.
什么是Linux coredump或Windows minidump的Java等价物?我已经阅读了堆转储,它看起来像我想要的,但是如何在未捕获的异常上(自动)触发它们?
我知道未捕获的异常处理程序,我已经用它来打印异常+堆栈跟踪并终止整个应用程序(否则线程死了,应用程序继续运行?呵呵?)另外我发现这篇文章关于如何记录堆从代码转储,但如果我从未处理的异常处理程序执行此操作,Java已经捕获了异常并且堆栈跟踪(和参数)消失了.
我遇到了-XX:+HeapDumpOnOutOfMemoryError似乎做我需要的旗帜,不幸的是只是因为内存异常,而不是其他未被捕获的异常.
到目前为止,这是我唯一能够摆脱谷歌的事情.目前我正在使用带有异常断点的附加调试器,但这是不切实际的,因为它还会中断处理的异常,因此无法在无人监督的情况下使用它.
[动机更新]
我希望能够检查堆栈跟踪的参数和局部变量,以找出导致异常的原因.它通常是空引用异常或断言失败,我不能总是从行号中猜出究竟出了什么问题.在C/C++中,我习惯于使用coredump/minidump崩溃,然后进一步检查实际导致崩溃的原因.
从WinDBG的输出窗口复制以下消息:
Use !analyze -v to get detailed debugging information.
BugCheck 24, {1904fb, 8f9ec9f8, 8f9ec5d0, 87c4fccc}
Probably caused by : Ntfs.sys ( Ntfs!NtfsCommonRead+6f4 )
Followup: MachineOwner
Run Code Online (Sandbox Code Playgroud)
请注意最后一行:"Followup:MachineOwner"
这是什么意思?
我有一个崩溃转储与此代码:
mov r11,rsp
push rdi
sub rsp,0A0h
mov qword ptr [rsp+30h],0FFFFFFFFFFFFFFFEh
Run Code Online (Sandbox Code Playgroud)
这是一个功能的序幕.所以,!analyze -v说INVALID_POINTER_READ与指令sub.AMD指令集表示,sub如果参数不是内存指针,则指令不会产生任何异常.
而且,READ_ADDRESS是ffffffffffffffff的,但在寄存器窗口,我可以看到rsp的12b3e0.这是64位操作系统中的32位应用程序.
我想知道这个错误的可能原因以及如何解决它.
UPD:
方法是Microsoft Visual Studio 9.0\VC\include\xtree中的std._Tree.insert(const value_type&_Val).
编译器是来自Visual Studio 2008安装的cl.exe,32位,版本15.00.30729.01.
命令行:
/FD /EHsc /MD /GS- /Zc:wchar_t- /Yu"stdafx.h"/W3 /WX /nologo /c /Zi /TP /wd4250 /FI -Zm200 -MP -w34100 -w34189
Run Code Online (Sandbox Code Playgroud)
链接器来自同一来源,版本9.00.30729.01.
UPD:对于那些对使用64位调试器调试32位应用程序持怀疑态度的人,我运行了32位版本的调试器并得到了相同的结果.所以,我仍然认为这是sub指令.
UPD:澄清:该应用程序是为32位平台构建的.但处理器和操作系统是64位的.因此,在转储中我们可以看到具有32位值的64位寄存器,这并不奇怪.
有没有办法在开发期间从Windows Phone 8中获取崩溃转储?我正在使用与正常Win32应用程序崩溃时类似的转储文件.或者类似于在崩溃时在iOS设备上保存的内容,以便稍后进行调查.
我的问题具体是关于以某种方式在崩溃后从手机中检索这个(或类似的)文件/信息而不必在我的代码中做任何事情,例如手动将堆栈跟踪写入来自未处理异常的文件.
我知道从beta提交的应用程序获取"实时"崩溃报告的选项,但这不是我所追求的.
谢谢!
我有一个托管(C#)应用程序的x64故障转储,它可以调用本机代码.在本机代码尝试取消引用错误的内存位置之后,以及在.NET编组程序将其转换为内存之后,转储被执行AccessViolationException.因此,发生错误的堆栈帧不再可用,发生异常的线程现在被CLR异常处理程序劫持:
0:017> kb
# RetAddr : Args to Child : Call Site
00 000007fe`fd3b10dc : 00000000`0402958b 00000000`20000002 00000000`00000e54 00000000`00000e4c : ntdll!NtWaitForSingleObject+0xa
01 000007fe`ea9291eb : 00000000`00000000 00000000`00000cdc 00000000`00000000 00000000`00000cdc : KERNELBASE!WaitForSingleObjectEx+0x79
02 000007fe`ea929197 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : clr!CLREventWaitHelper2+0x38
03 000007fe`ea929120 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : clr!CLREventWaitHelper+0x1f
04 000007fe`ead8cae5 : 00000000`29cbc7c0 00000000`3213ce40 00000000`00000000 00000000`ffffffff : clr!CLREventBase::WaitEx+0x70
05 000007fe`ead8c9d0 : 00000000`29cbc7c0 00000000`00000000 00000000`0002b228 00000000`0002b228 : clr!Thread::WaitSuspendEventsHelper+0xf5
06 000007fe`eacf2145 : 00000000`007ea060 000007fe`ea924676 00000000`00000000 000007fe`fd3b18da : clr!Thread::WaitSuspendEvents+0x11
07 000007fe`eaccc00c : …Run Code Online (Sandbox Code Playgroud) 我有一种情况,我的应用程序有时会在暂停/恢复过程中崩溃.场景如下所示:
Taking the app dump file and examining it using WinDBG shows a call stack like …
fatalError("Descriptive Error")我的应用程序中有很多行。我想找到实际触发错误的行。
但是,我无法通过Crashlytics获得此类信息。这是我得到的:
#0. Crashed: com.apple.main-thread
0 libswiftCore.dylib 0x10173cd24 specialized _fatalErrorMessage(_:_:file:line:flags:) + 128
1 libswiftCore.dylib 0x101561118 _ArrayBuffer._checkInoutAndNativeTypeCheckedBounds(_:wasNativeTypeChecked:) + 240
2 libswiftCore.dylib 0x10157b318 Array.subscript.getter + 112
3 AppName 0x10097d520 ClassName3.select(_:) (ClassName3.swift:61)
4 AppName 0x1008ee03c ClassName2.init(_:) (ClassName2.swift:28)
5 AppName 0x1008edca0 ClassName2.__allocating_init(_:) (ClassName2.swift:24)
6 AppName 0x1008603c4 ClassName4.makeController() (ClassName4.swift:19)
7 AppName 0x1008d6c88 ClassName.ClassName6(_:didSelect:) (ClassName.swift:108)
8 AppName 0x1008d6e04 protocol witness for ClassName6Delegate.ClassName6(_:didSelect:) in conformance ClassName (<compiler-generated>)
9 AppName 0x100855de0 ClassName6.text(card:) (ClassName6Item.swift:71)
10 AppName 0x100855f04 protocol witness for ClassName5.text(card:) in conformance ClassName6 (<compiler-generated>)
11 AppName …Run Code Online (Sandbox Code Playgroud)