淘宝旺旺 Taobao WangWang 我要从技术的角度表扬你
最近在考虑买一块可以测心律的手表,首先想到的就是taobao.com. 根据某店长的经验,使用WangWang是可以跟卖家还价的。于是立刻下载WangWang装上。安装完成后,第一次运行,咣当,跳一个框框说WangWang发生了问题(crash),要不要再试一次,或者发送错误报告。给我的一个感觉就是乃居然学起Office了。考虑到你出错界面还很友好,好吧,我重新来一次,咣当,还是一样的结果。
我在家里用一直都没什么问题的,今天怎么这么诡异?好吧好吧,谁让偶们是吃这碗饭的呢,就仔细看看吧。点了一下察看详情,弹出一个框框,哇,怎么这么熟悉!!!兄弟们发现没有,居然字体都跟windbg的默认字体一样。第一次看到这么professional的错误报告,乃下次不如用IIS Diagnostics工具整一个更漂亮的mht报告吧.
看到这里,我也没兴趣去管为什么会crash了。先看乃是不是真的生成了dump文件。kao,在安装目录下,果然就有一个dump子目录,里面果然有.dmp文件。taobao真牛,乃以后如果要上case, adplus都不用教乃怎么用了,直接就给dump了。好吧,打开一个看看:
Loading Dump File [D:\Program Files\淘宝网\淘宝旺旺\DUMP\cf003d74f83c2543b9f895b8119753e4\Process.dmp]
User Mini Dump File: Only registers, stack and portions of memory are available
(1f5c.1bb4): Access violation - code c0000005 (!!! second chance !!!)
eax=00000000 ebx=00000004 ecx=0012d984 edx=7c82ed54 esi=00000100 edi=00000000
eip=7c82ed54 esp=0012e260 ebp=0012e2d0 iopl=0 nv up ei pl zr na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!KiFastSystemCallRet:
7c82ed54 c3 ret
0:000> vertarget
Windows Server 2003 Version 3790 (Service Pack 1) MP (2 procs) Free x86 compatible
Product: Server, suite: Enterprise TerminalServer SingleUserTS
kernel32.dll version: 5.2.3790.1830 (srv03_sp1_rtm.050324-1447)
Debug session time: Fri May 5 08:50:03.000 2006 (GMT+8)
System Uptime: not available
Process Uptime: not available
Kernel time: 0 days 0:00:00.000
User time: 0 days 0:00:00.000
0:000> !runaway
User Mode Time
Thread Time
1:19b0 0 days 0:00:00.000
0:1e9c 0 days 0:00:00.000
0:000> lmvm WangWang
start end module name
00400000 0080d000 WangWang (deferred)
Mapped memory image file: D:\Program Files\淘宝网\淘宝旺旺\WangWang.exe
Image path: D:\Program Files\淘宝网\淘宝旺旺\WangWang.exe
Image name: WangWang.exe
Timestamp: Fri Feb 24 13:50:17 2006 (43FE9E99)
CheckSum: 00000000
ImageSize: 0040D000
File version: 1.5.5.1226
Product version: 1.5.5.1226
File flags: 0 (Mask 3F)
File OS: 4 Unknown Win32
File type: 1.0 App
File date: 00000000.00000000
Translations: 0804.0000
CompanyName: 淘宝(中国)软件有限公司
ProductName: 淘宝旺旺
InternalName: 淘宝旺旺
OriginalFilename: WangWang.EXE
ProductVersion: 1, 5, 5, 1226
FileVersion: 1, 5, 5, 1226
PrivateBuild: 1, 5, 5, 1226
SpecialBuild: 1, 5, 5, 1226
FileDescription: 淘宝旺旺
LegalCopyright: Copyright (C) 2004-2006
LegalTrademarks: Copyright (C) 2004-2006
Comments: 1.5
0:000> kb
ChildEBP RetAddr Args to Child
0012e25c 7c822124 77e6baa8 00000100 00000000 ntdll!KiFastSystemCallRet
0012e260 77e6baa8 00000100 00000000 00000000 ntdll!NtWaitForSingleObject+0xc
0012e2d0 77e6ba12 00000100 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xac
0012e2e4 004433d7 00000100 ffffffff 00000000 kernel32!WaitForSingleObject+0x12
WARNING: Stack unwind information not available. Following frames may be wrong.
0012e374 004434c0 0067b0d0 ffffffff 0012e368 WangWang+0x433d7
0012e388 77e995f7 0012e624 0060d6d8 01161e90 WangWang+0x434c0
0012e5e0 0057635c 0012e624 00000000 0012ffb0 kernel32!UnhandledExceptionFilter+0xac
0012e5f8 0056e43c 00000000 0012e624 0057315b WangWang+0x17635c
0012ffc0 77e523cd 00000000 00000000 7ffde000 WangWang+0x16e43c
0012fff0 00000000 0056e342 00000000 78746341 kernel32!BaseProcessStart+0x23
0:000> !exchain
0012e2c0: kernel32!_except_handler3+0 (77e6b798)
CRT scope 0, func: kernel32!WaitForSingleObjectEx+df (77e6baf0)
0012e368: WangWang+1e2ad9 (005e2ad9)
0012e5d0: kernel32!_except_handler3+0 (77e6b798)
0012e644: ntdll!ExecuteHandler2+3a (7c82eec6)
0012ea74: WangWang+1ed71a (005ed71a)
0012eaec: WangWang+1f7c28 (005f7c28)
0012eb3c: WangWang+1ee399 (005ee399)
0012eb9c: WangWang+1f7bb0 (005f7bb0)
0012ec5c: user32!_except_handler3+0 (773b3987)
CRT scope 0, func: user32!UserCallWinProcCheckWow+156 (773c5968)
0012ecb8: user32!_except_handler3+0 (773b3987)
0012ed08: ntdll!KiUserCallbackExceptionHandler+0 (7c82ec50)
0012f20c: WangWang+1f8b54 (005f8b54)
0012f270: WangWang+1f79a4 (005f79a4)
0012f2fc: WangWang+1f9038 (005f9038)
0012f370: WangWang+1f7945 (005f7945)
0012ff04: WangWang+1e01db (005e01db)
0012ffb0: WangWang+173110 (00573110)
0012ffe0: kernel32!_except_handler3+0 (77e6b798)
CRT scope 0, filter: kernel32!BaseProcessStart+29 (77e971c8)
func: kernel32!BaseProcessStart+3a (77e971de)
en..乃在exception chain里面干了这么多活
0:000> lmf
start end module name
00360000 00378000 VLNetwork D:\Program Files\淘宝网\淘宝旺旺\VLNetwork.dll
00380000 003a9000 AliViewMedia D:\Program Files\淘宝网\淘宝旺旺\AliViewMedia.dll
003b0000 003c7000 VideoCAP D:\Program Files\淘宝网\淘宝旺旺\VideoCAP.dll
003d0000 003e6000 VLAudio D:\Program Files\淘宝网\淘宝旺旺\VLAudio.dll
003f0000 00400000 JsmShow D:\Program Files\淘宝网\淘宝旺旺\JsmShow.dll
00400000 0080d000 WangWang D:\Program Files\淘宝网\淘宝旺旺\WangWang.exe
01320000 01380000 Ali_Res D:\Program Files\淘宝网\淘宝旺旺\Ali_Res.dll
10000000 10042000 AliViewCtrl D:\Program Files\淘宝网\淘宝旺旺\AliViewCtrl.dll
37f00000 37f0f000 Cjktl32 D:\Program Files\Powerword 2003\Cjktl32.dll
4b8d0000 4b921000 msctf C:\WINDOWS\SYSTEM32\msctf.dll
4dc30000 4dc5e000 msctfime C:\WINDOWS\SYSTEM32\msctfime.ime
5e9a0000 5e9b7000 olepro32 C:\WINDOWS\SYSTEM32\olepro32.dll
62d80000 62d89000 lpk C:\WINDOWS\SYSTEM32\lpk.dll
71bb0000 71bb9000 wsock32 C:\WINDOWS\SYSTEM32\wsock32.dll
71bf0000 71bf8000 ws2help C:\WINDOWS\SYSTEM32\ws2help.dll
71c00000 71c17000 ws2_32 C:\WINDOWS\SYSTEM32\ws2_32.dll
73070000 73097000 winspool C:\WINDOWS\SYSTEM32\winspool.drv
73250000 73255000 riched32 D:\Program Files\淘宝网\淘宝旺旺\riched32.dll
73d30000 73e2e000 mfc42 D:\Program Files\淘宝网\淘宝旺旺\mfc42.dll
73e50000 73eae000 dsound C:\WINDOWS\SYSTEM32\dsound.dll
74b40000 74b61000 oledlg C:\WINDOWS\SYSTEM32\oledlg.dll
74d90000 74dfc000 riched20 D:\Program Files\淘宝网\淘宝旺旺\riched20.dll
75490000 754f1000 usp10 C:\WINDOWS\SYSTEM32\usp10.dll
75e60000 75e87000 apphelp C:\WINDOWS\SYSTEM32\apphelp.dll
75ff0000 76055000 msvcp60 D:\Program Files\淘宝网\淘宝旺旺\msvcp60.dll
76190000 761a2000 msasn1 C:\WINDOWS\SYSTEM32\msasn1.dll
761b0000 76243000 crypt32 C:\WINDOWS\SYSTEM32\crypt32.dll
76290000 762ad000 imm32 C:\WINDOWS\SYSTEM32\imm32.dll
762b0000 762fa000 comdlg32 C:\WINDOWS\SYSTEM32\comdlg32.dll
76aa0000 76acd000 winmm C:\WINDOWS\SYSTEM32\winmm.dll
77210000 772b8000 wininet C:\WINDOWS\SYSTEM32\wininet.dll
77380000 77412000 user32 C:\WINDOWS\SYSTEM32\user32.dll
77420000 77523000 comctl32_77420000 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.3790.1830_x-ww_7AE38CCF\comctl32.dll
77530000 775c7000 comctl32 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_5.82.3790.1830_x-ww_1B6F474A\comctl32.dll
77670000 777a4000 ole32 C:\WINDOWS\SYSTEM32\ole32.dll
77b90000 77b98000 version C:\WINDOWS\SYSTEM32\version.dll
77ba0000 77bfa000 msvcrt C:\WINDOWS\SYSTEM32\msvcrt.dll
77c00000 77c48000 gdi32 C:\WINDOWS\SYSTEM32\gdi32.dll
77c50000 77cef000 rpcrt4 C:\WINDOWS\SYSTEM32\rpcrt4.dll
77d00000 77d8c000 oleaut32 C:\WINDOWS\SYSTEM32\oleaut32.dll
77da0000 77df2000 shlwapi C:\WINDOWS\SYSTEM32\shlwapi.dll
77e40000 77f42000 kernel32 C:\WINDOWS\SYSTEM32\kernel32.dll
77f50000 77fec000 advapi32 C:\WINDOWS\SYSTEM32\advapi32.dll
7c800000 7c8c0000 ntdll C:\WINDOWS\SYSTEM32\ntdll.dll
7c8d0000 7d0d3000 shell32 C:\WINDOWS\SYSTEM32\shell32.dll
发生问题的时候,也没加载啥乱七八糟的东西啊
0:000> .exr 0x0012e710
ExceptionAddress: 0043867a (WangWang+0x0003867a)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 00000000
Parameter[1]: 00000004
Attempt to read from address 00000004
0:000> u WangWang+0x0003867a
WangWang+0x3867a:
0043867a 8b4804 mov ecx,[eax+0x4]
0043867d 51 push ecx
0043867e ff15d8b75f00 call dword ptr [WangWang+0x1fb7d8 (005fb7d8)]
00438684 8be5 mov esp,ebp
00438686 5d pop ebp
由于是mini dump, 又没有symbol, 能看的也就这么点了。接下来,我就尝试用windbg打开wangwang.exe, 然后来截获这个1st chance AV看看到底是什么奇妙的东西,可是,wangwang给了我更奇妙的结果。问题无法重现了!!关掉windbg, 再疯狂开关开关wangwang 很多次,问题还是不发生,我想尽点人事的愿望也落空了。
我知道COM+ Crash后会生成dump, Office Crash后会生成dump, QQ Crash后会做什么乱七八糟的事情,但是,都没有wangwang做得清晰和地道!以前一直对wangwang感觉不错,就趁机研究一下吧。首先,dump格式并没有公开,wangwang肯定是调用了dbghelp.dll里面的API. 看了一下mini dump, wangwang.exe没有加载dbghelp.dll阿。傻,自己抓自己dump哪里有这么容易的。到wangwang目录看看,嘿嘿,果然有一个叫做CrashDumper.exe的冬冬link到了dbghelp.dll。就是乃了!接下来,我尝试着去检查wangwang是如何调用CrashDumper.exe的,用了下面一些方法:
1. 现在wangwang不crash了,所以我总得想办法让他crash吧。于是我用windbg连上去后随便修改了一下ebp, 然后AV了。但是1st/2nd exception被windbg截下来, 2nd AV后就直接crash了,根本没机会去执行wangwang的handler... 至于原因么,接下来再研究。
2. 既然上面的方法行不通,我在修改ebp后detach windbg, 这样wangwang就该调用做CrashDumper.exe抓dump了吧.然后我修改Image File Execution Options这个注册表,给CrashDumper.exe添加debugger,这样CrashDumper.exe启动的时候我的windbg就跟着起来,然后执行自定义的script启动另外一个windbg去attach wangwang.exe. 可是,我还是一厢情愿自作多情了.我如果在注册表里面指定windbg.exe, 启动的时候弹出来的居然是windbg的帮助;如果我指定cdb.exe,cdb启动后一闪而过.至于原因么,接下来再研究.
3.我只有来野蛮的了.我把CrashDumper.exe给删除了,然后看你怎么生成dump. 哈哈,果然跳一个messagebox说CrashDumper.exe找不到了.这个时候我再用windbg连到wangwang上去看,就能够看到上下文了.可惜,没有symbol的调试太累,5分钟后放弃.
让我感到欣慰的是,我上面的功夫没有完全白费.在我一遍一遍的失败过程中,我居然又偶然重现了一次问题,而且是在windbg中重现的.那么第一件事情就是把full dump给保存下来,看到:
0:000> k100
ChildEBP RetAddr
WARNING: Stack unwind information not available. Following frames may be wrong.
0012e9fc 004cea48 WangWang+0x3867a
0012ea80 005c36da WangWang+0xcea48
0012eaf8 005c33d0 WangWang+0x1c36da
0012eb18 004d74e1 WangWang+0x1c33d0
0012eb48 005c22d7 WangWang+0xd74e1
0012eba8 005c24f2 WangWang+0x1c22d7
0012ebc8 7739c3b7 WangWang+0x1c24f2
0012ebf4 7739c484 user32!InternalCallWinProc+0x28
0012ec6c 7739ca68 user32!UserCallWinProcCheckWow+0x151
0012ecc8 773948bf user32!DispatchClientMessage+0xd9
0012ecf8 7c82ec9e user32!__fnINLPCREATESTRUCT+0x8b
0012eda0 77394855 ntdll!KiUserCallbackDispatcher+0x2e
0012f040 77394a07 user32!NtUserCreateWindowEx+0xc
0012f0ec 7738e988 user32!_CreateWindowEx+0x1ed
0012f128 005c2a59 user32!CreateWindowExA+0x33
0012f198 005d3570 WangWang+0x1c2a59
0012f1d8 005d3780 WangWang+0x1d3570
0012f218 005cbc43 WangWang+0x1d3780
0012f24c 005c7843 WangWang+0x1cbc43
0012f27c 005cf7ad WangWang+0x1c7843
0012f308 005c079d WangWang+0x1cf7ad
0012f318 005c092a WangWang+0x1c079d
0012f348 005d73aa WangWang+0x1c092a
0012f37c 00401ba8 WangWang+0x1d73aa
0012ff10 005c76f4 WangWang+0x1ba8
0012ffc0 77e523cd WangWang+0x1c76f4
0012fff0 00000000 kernel32!BaseProcessStart+0x23
0:000> u eip
WangWang+0x3867a:
0043867a 8b4804 mov ecx,[eax+0x4]
0043867d 51 push ecx
0043867e ff15d8b75f00 call dword ptr [WangWang+0x1fb7d8 (005fb7d8)]
00438684 8be5 mov esp,ebp
00438686 5d pop ebp
00438687 c3 ret
00438688 cc int 3
00438689 cc int 3
嗯,没错,跟mini dump的错误地址一样.如果taobao的技术人员有兴趣,请跟我联系获取full dump.
总结一下以前使用wangwang的感受和今天的研究,我认为wangwang是一款非常负责任的软件.开发人员如果不关心软件质量,不会考虑生成dump文件和详细的安装log做检查,如果不关心用户感受,不会使用CrashDumper.ini做灵活的配置和贴心的出错界面.同时,从整个目录结构上看,各个模块都非常清晰,一点都没有流氓软件的迹象.同时,我也没有发现wangwang向IE或者其它系统组件流氓地添加插件的情况.(曾经有报道wangwang会inject IE, 但是目前的版本我没看到有这样的行为).如果结合taobao.com网站来看,wangwang非常好地发挥了整个taobao平台的伸缩性和灵活性.比如通过本地代理实现taobao.com的single signon, 所有的功能都尽可能定向到taobao.com通过HTTP完成.
当然,taobao还有一些可以改进的地方,比如:
1. 自动把店铺里面的商品导出到本地的Excel文件.(当前我是自己开发一个工具手动parse每一个页面来完成的)
2. 自动批量到入商品.(如果taobao/eachnet都能够开发接口,那店家就可以很方面的同步两边的店面)
3. 某些操作和UI还是过于复杂.
祝愿taobao继续高歌猛进!!!