2019年5月

一个Windbg/cdb极其缓慢的例子

最近做自动dump分析的时候,突然发现cdb慢到难以忍受,我启动的参数是:

"C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe" -y cache*D:\symbol -z %%s

而且我分析的dump的核心dump我也确定已经缓存到了d:\symbol中。但是cdb.exe依然以难以忍受的速度(平均30分钟分析一个文件),在一番抓包以后,我惊讶的发现cdb.exe仍然试图从一些网络服务器爬取数据。

很快我就开始怀疑_NT_SYMBOL_PATH的环境变量,果不其然,对于cdb.exe来说,这个环境变量居然优先于命令行传入的值。

我在_NT_SYMBOL_PATH设置的值为:

cache*D:\symbol;SRV*https://msdl.microsoft.com/download/symbols;SRV*https://chromium-browser-symsrv.commondatastorage.googleapis.com;\\PRIVATE_SYMBOL_SERVER

但很快就能发现不对的是,可以发现它在\PRIVATE_SYMBOL_SERVER遍历目录,通过查询MSDN(https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/symbol-path)得知,针对有结构的symbol server要加上SRV*,这样才能避免直接去目录下疯狂遍历搜索。 所以修正后的SYMBOL PATH应当为:

cache*D:\symbol;SRV*https://msdl.microsoft.com/download/symbols;SRV*https://chromium-browser-symsrv.commondatastorage.googleapis.com;SRV*\\PRIVATE_SYMBOL_SERVER