[wine-zh] Wine debug channel 使用技巧

  • From: Qian Hong <fracting@xxxxxxxxx>
  • To: wine-zh <wine-zh@xxxxxxxxxxxxx>
  • Date: Fri, 22 Feb 2013 13:54:36 +0800

大家好!

发个帖子抛砖引玉, 记录阅读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�)��

Other related posts:

  • » [wine-zh] Wine debug channel 使用技巧 - Qian Hong