大家好! 发个帖子抛砖引玉, 记录阅读Wine日志的一些技巧,先写一点,以后有时间慢慢补充,也希望大家一起交流经验! 这里先分享一点关于+relay日志的阅读经验: +relay 是 Wine 最重要的一个debug channel,可以跟踪每一个api调用, 但是+relay产生的日志非常巨大,所以需要一些技巧去阅读. 做个简单的实验: WINEDEBUG=+relay notepad &> notepad-relay.txt 等待notepad打开之后,关闭窗口,再看看保存下来的日志有多大. 我这里产生的日志有 7.7M, 一共 111,909 行, 其实这已经算小的了. 现实中调试的时候,产生的日志常常有几个G那么大. 如何从11万行甚至更多的日志中找到我们关心的信息呢?这就需要一些技巧和经验.这里仅记录一些最基本的东西: 1. 进程启动的时候, 日志中有什么标识? 2. 线程启动呢? 3. 进程结束呢? 4. 线程结束呢? 在日志中搜索 notepad, 可以看到这么一行: 0009:Starting process L"C:\\windows\\system32\\notepad.exe" 这就启示我们, 进程启动的时候, 会有 Starting process ... 这样的日志出现, 而开头的四位十六进制数例如0009则是线程ID. 在日志中搜索 "Starting process", 还可以发现类似的其他日志: 000b:Starting process L"C:\\windows\\system32\\wineboot.exe" 000f:Starting process L"C:\\windows\\system32\\services.exe" (entryproc=0x7ebbf7a8) 0013:Starting process L"C:\\windows\\system32\\winedevice.exe" (entryproc=0x7ec2c9d4) 这里的entryproc是exe文件启动时运行的起始地址. (Wine的日志有时候会打印不完整, 所以我复制出来的日志不总是完整的, 多运行几次一般就能得到完整的日志了.) 类似的, 线程开始的标识是 "Starting thread", 例如: 0015:Starting thread proc 0x7eb60dba (arg=0x118aa8) 这里的 thread proc 0x7eb60dba 是线程开始运行的地址, 了解Windows编程的朋友就容易想到,这个地址就是 CreateThread() 函数里的 第3个参数 LPTHREAD_START_ROUTINE start. 进程结束的标识是 ExitProcess, 例如: 000d:Call KERNEL32.ExitProcess(00000000) ret=7ebc8a3e 线程结束的标识,一般可以看 THREAD_DETACH ,例如: 0011:Call PE DLL (proc=0x7eb720b4,module=0x7eb20000 L"rpcrt4.dll",reason=THREAD_DETACH,res=(nil)) 注意,要研究线程的启动和结束的日志,光用notepad还不是很理想,因为notepad是个单线程的程序,如果你在Wine下跑个迅雷或者其他多线程程序,再去看relay日志,就能找到线程创建和结束的很多例子了.本例中的线程创建和结束其实不是notepad的,而是Wine '后台' 运行的一些服务程序的. 此外, 进程开始的还有另一种情况就是通过 CreateProcess 调用产生的进程, 这时候不会打印 'Starting process' 这行日志 (如果我没记错的话). 知道了进程和线程的启动和结束的这类"标识"之后,在阅读的时候就能确定一个上界和一个下届,并且可以根据线程号grep一下,过滤我们不感兴趣的信息,这也日志的大小就会缩小很多. 此外,还有一个小技巧可以帮助减小日志的体积: 在启动我们打算调试的程序之前,先在另一个终端启动一个Wine的小程序,例如winemine (什么,你不知道Wine自带了扫雷游戏??!), 然后再运行我们的调试对象记录日志, 这样Wine的初始化过程以及后台进程的日志就不会记录在我们的relay日志中,日志自然就小很多.举例如下: 1.假设我们要调试的程序是notepad 2.假设winemine是出来打酱油的 第一步: 开一个终端, 运行打酱油的winemine $ winemine 第二步: 再开一个终端, 运行我们的目标程序 $ wine notepad &> relay-notepad2.txt 这时候再关闭notepad, 可以发现 relay-notepad2.txt 的体积比刚才的版本小了很多,在日志里搜索一下 'Starting process' 'Starting thread' 也会发现少了很多无关的进程和线程. 这么做之后,我的relay-notepad2.txt只有3000多行,体积只有238k,这样的日志就容易读多了. 下回继续写别的,也欢迎其他朋友交流经验! happy hacking to all :) -- Regards, Qian Hong - http://www.winehq.org )^����r�)��