Windbg 从Microsoft Dev Dashboard的崩溃中获取符号
Microsoft Windows Dev Center仪表板允许我在野外收集本机桌面应用程序中失败的堆栈跟踪 不幸的是,小型转储不可用。我刚刚得到一个TSV文件,其中(有时)有一个堆栈跟踪,如下所示:Windbg 从Microsoft Dev Dashboard的崩溃中获取符号,windbg,crash-reports,minidump,windows-dev-center,postmortem-debugging,Windbg,Crash Reports,Minidump,Windows Dev Center,Postmortem Debugging,Microsoft Windows Dev Center仪表板允许我在野外收集本机桌面应用程序中失败的堆栈跟踪 不幸的是,小型转储不可用。我刚刚得到一个TSV文件,其中(有时)有一个堆栈跟踪,如下所示: Frame Image Function Offset 0 MyApp 0x2F59A1 1 MyApp 0x11CEA8 2 MyApp 0x11AE74 3 MyApp 0x151289
Frame Image Function Offset
0 MyApp 0x2F59A1
1 MyApp 0x11CEA8
2 MyApp 0x11AE74
3 MyApp 0x151289
4 MyApp 0x2A686
5 MyApp 0x180720
6 MyApp 0x1807B6
7 MyApp 0x2E875A
8 MyApp 0x2E8882
9 kernel32 BaseThreadInitThunk 0x24
10 ntdll __RtlUserThreadStart 0x2B
11 ntdll _RtlUserThreadStart 0x1B
为了实现这个uesful,我在WinDbg中加载匹配的二进制文件,计算出偏移量加上基址,然后在结果地址处取消装配。如果我的应用程序在0x00400000处加载,我将0x2F59A1添加到其中并获得0x006F59A1。这里的“解装配”向我显示了堆栈帧的返回地址,因此我可以了解崩溃的原因
有更好的办法吗?如何从开发中心请求小型转储?(Microsoft支持人员说我就是不能。真的吗?)有没有脚本可以在TSV文件中转换可用的堆栈跟踪,这样我就不会手动计算每个堆栈帧?还有别的办法吗?我不知道你能不能得到一个.dmp。谷歌说你不能从仪表板上得到一个 下面的答案是脚本的修改版本 我曾经用它来分解@.map文件偏移量,如果需要的话,我可以即兴制作 它使用pandas
创建命令字符串并使用子进程在该偏移量处反汇编 我假设tsv是一个标签分离的值文件,如果不是的话,你有一些调整要做 假设使用如下数据的制表符分隔文件
Frame Image Function Offset
0 calc 0x1012
0 calc 0x1015
您可以在下面的代码中使用一些for循环来自动化该过程
编辑,因为我执行了两个子流程调用,所以正向和反向反汇编的偏移量都不同(ASLR效应)
相关报道:谢谢,@ThomasWeller,我会看看是否能找到我的支持联系人来确认转储的可用性。我有时会在没有转储的情况下得到这些TSV调用堆栈,我希望它们更容易使用。我有几十个TSV文件,只有一个可下载的迷你转储文件(截至目前)。
:\>cat Untitled.py
import pandas as pd
df = pd.read_csv("tsv.txt" , delimiter='\t')
print df
offset = df.Function.unique()[1]
print offset
import subprocess
cmdline = "cdb -c \"ub calc+"+offset+";q\" calc.exe | tail"
print cmdline
output = subprocess.check_output(cmdline ,shell=True )
print output
cmdline = "cdb -c \"u calc+"+offset+";q\" calc.exe | tail"
print cmdline
output = subprocess.check_output(cmdline ,shell=True )
print output
:\>python Untitled.py
Frame Image Function Offset
0 0 calc 0x1012 NaN
1 0 calc 0x1015 NaN
0x1015
cdb -c "ub calc+0x1015;q" calc.exe | tail
calc!_imp__SHGetFolderPathW+0x1:
00f31005 57 push edi
00f31006 1f pop ds
00f31007 7629 jbe calc!_imp__GdipCloneImage+0x2 (00f31032)
00f31009 a1237683dd mov eax,dword ptr ds:[DD837623h]
00f3100e 27 daa
00f3100f 7646 jbe calc!_imp__GdipDeleteGraphics+0x3 (00f31057)
00f31011 1e push ds
00f31012 197600 sbb dword ptr [esi],esi
quit:
cdb -c "u calc+0x1015;q" calc.exe | tail
calc!⌂SHELL32_NULL_THUNK_DATA+0x1:
009b1015 0000 add byte ptr [eax],al
009b1017 007a41 add byte ptr [edx+41h],bh
009b101a 5f pop edi
009b101b 7700 ja calc!⌂SHLWAPI_NULL_THUNK_DATA+0x1 (009b101d)
009b101d 0000 add byte ptr [eax],al
009b101f 005fa1 add byte ptr [edi-5Fh],bl
009b1022 687449a568 push 68A54974h
009b1027 744a je calc!_imp__GdiplusShutdown+0x3 (009b1073)
quit:
:\>