1

Microsoft Windows 开发中心仪表板让我可以收集来自本地桌面应用程序故障的堆栈跟踪。

不幸的是,小型转储不可用。我只是得到一个 TSV 文件,其中(有时)有一个堆栈跟踪,它看起来像这样:

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    

为了使这变得有用,我在 WinDbg 中加载匹配的二进制文件,计算出偏移量加上基地址,然后在结果地址处反汇编。如果我的应用程序在 0x00400000 加载,我添加 0x2F59A1 并得到 0x006F59A1。在那里反汇编显示了该堆栈帧的返回地址,因此我可以了解崩溃的原因。

有没有更好的办法?如何从开发中心请求小型转储?(微软支持说我不能。真的吗?)是否有脚本可以在 TSV 文件中转换可用的堆栈跟踪,这样我就不会手动评估每个堆栈帧?还有其他方法吗?

4

1 回答 1

1

我不知道你能不能得到一个.dmp 谷歌说你不能从仪表板上得到一个

下面的答案是一个脚本的修改版本,我曾经用它来反汇编@ .map 文件偏移量,如果需要,它会从列中获取偏移量,使用 pandas
创建一个命令字符串并使用子进程在该偏移量处反汇编

我假设 tsv 是一个制表符分隔值文件,如果不是你需要做一些调整

假设制表符分隔文件的数据如下

Frame   Image   Function    Offset
0   calc    0x1012
0   calc    0x1015 

您可以在下面的代码中使用一些 for 循环来自动化该过程

编辑,因为我做了两个子进程调用,前向和后向反汇编的偏移量不同(ASLR 效果)

:\>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:


:\> 
于 2018-07-26T19:05:15.647 回答