在使用drmemory运行一组测试后,我试图通过提供pdb符号来解决错误堆栈。 pdb来自一个大型的samba映射存储库,在运行时使用_NT_SYMBOL_PATH会使事情变得过于缓慢。
有没有人知道一个后处理results.txt的工具,并根据需要拉出新符号(通过NT_SYMBOL_PATH或其他)来生成更详细的堆栈?如果没有,任何调整asan_symbolize.py的提示都可以做到这一点?
https://llvm.org/svn/llvm-project/compiler-rt/trunk/lib/asan/scripts/asan_symbolize.py
到目前为止,我使用dbghelp.dll提出的内容如下。工作但可能更好。
答案 0 :(得分:1)
确定此查询与windbg的使用无关或与_NT_SYMBOL_PATH
没有任何关系
Dr.Memory
是memory diagnostic tool
类似于valgrind
,基于Dynamorio instumentation framework
可用于原始未修改的二进制文件
,您可以从命令提示符drmemory.exe calc.exe
(cmd.exe)
二进制文件执行完毕后,名为results.txt
的日志文件将写入默认位置
如果您设置了_NT_SYMBOL_PATH drmemory,并且从预编号的符号文件(即* .pdb)中解析符号信息,它似乎不会从ms符号服务器下载文件,它似乎只是忽略了SRV *缓存并且似乎只使用下游符号文件夹
所以如果pdb文件丢失或尚未下载
results.txt将包含像
这样的堆栈跟踪# 6 USER32.dll!gapfnScSendMessage +0x1ce (0x75fdc4e7 <USER32.dll+0x1c4e7>)
# 7 USER32.dll!gapfnScSendMessage +0x2ce (0x75fdc5e7 <USER32.dll+0x1c5e7>)
如果符号文件可用,则会显示
# 6 USER32.dll!InternalCallWinProc
# 7 USER32.dll!UserCallWinProcCheckWow
所以基本上你需要有问题的appplication的符号文件
所以我评论你需要获取有问题的exe的符号
您也可以在正在运行的进程上使用symchk并创建清单文件 并且您可以在连接到Internet的计算机上使用symchk 下载符号并将其复制到non_internet计算机上的本地文件夹 并将_NT_SYMBOL_PATH指向此文件夹
>tlist | grep calc.exe
1772 calc.exe Calculator
>symchk /om calcsyms.txt /ip 1772
SYMCHK: GdiPlus.dll FAILED - MicrosoftWindowsGdiPlus-
1.1.7601.17514-gdiplus.pdb mismatched or not found
SYMCHK: FAILED files = 1
SYMCHK: PASSED + IGNORED files = 27
>head -n 4 calcsyms.txt
calc.pdb,971D2945E998438C847643A9DB39C88E2,1
calc.exe,4ce7979dc0000,1
ntdll.pdb,120028FA453F4CD5A6A404EC37396A582,1
ntdll.dll,4ce7b96e13c000,1
>tail -n 4 calcsyms.txt
CLBCatQ.pdb,00A720C79BAC402295B6EBDC147257182,1
clbcatq.dll,4a5bd9b183000,1
oleacc.pdb,67620D076A2E43C5A18ECD5AF77AADBE2,1
oleacc.dll,4a5bdac83c000,1
所以假设您已经获取了符号,那么使用符号文件的本地缓存副本重新运行测试会更容易
如果您已经获取了符号,但是您无法重新运行测试并且必须仅使用results.txt的输出,那么您将进行一些文本处理工作(sed.grep,awk。或自定义解析器)
drmemory套件在bin文件夹中附带一个symbolquery.exe,它可用于解析results.txt中的符号
在上面的示例中,您可以注意到相对于modulebase的偏移量 行#6 USER32.dll!gapfnScSendMessage + 0x1ce(0x75fdc4e7 {USER32.dll + 0x1c4e7})
0x1c4e7因此对于results.txt中的每一行,您必须解析偏移量并在模块上调用symbolquery,如下所示
:\>symquery.exe -f -e c:\Windows\System32\user32.dll -a +0x1c4e7
InternalCallWinProc+0x23
??:0
:\>symquery.exe -f -e c:\Windows\System32\user32.dll -a +0x1c5e7
UserCallWinProcCheckWow+0xb3
来自result.txt和修剪输出的简单测试处理示例
:\>grep "^#" results.txt | sed s/".*<"//g
# 0 system call NtUserBuildPropList parameter #2
USER32.dll+0x649d9>)
snip
COMCTL32.dll+0x2f443>)
注意comctl32.dll(在system32.dll中有一个默认的comctl.dll,在winsxs中还有其他几个你必须查询其他文件,比如global.log来查看dll加载路径
symquery.exe -f -e c:\Windows\winsxs\x86_microsoft.windows.common-
controls_6595b64144ccf1df_6.0.7601.17514_none_41e6975e2bd6f2b2\comctl32.dll -a +0x2f443
CallOriginalWndProc+0x1a
??:0
symquery.exe -f -e c:\Windows\system32\comctl32.dll -a +0x2f443
DrawInsert+0x120 <----- wrong symbol due to wrong module (late binding
/forwarded xxx yyy reasons)