Wine 调试bug总结(MSYS2篇)

[ ]

The content is recoverd from Wordpress Blog, for more details please check HERE

August 22, 2015

VOID001 Comments 0 Comment

我将如何调试MSYS2中的某个开源程序的bug的过程总结下来,提供给需要的人

1.配置好环境

– 获得wine-staging的源码

– 编译并安装wine

2.利用自己配置好的环境重现bug 注意一定要下载正确版本的代码进行编译3.下载要debug的软件安装的源码并且编译成有符号表的程序 在 gdb下调试 利用step in 和 next 等命令 ,找出bug发生的地方(就是出现fault 的那个点)

-在MSYS2下git clone不可以用 因此需在Linux下进行某些代码的clone 然后再makepkg的时候i记得加上 –noextract 参数

– 学习PKGBUILD的语法和写法

– 学习makepkg 等指令 ( 如果不能通过checksum checkpgp 就用 –skippgpcheck 和 –skipchecksums 跳过)

4.阅读该程序的源代码 , 从bug发生的点向上找, 找出问题所在 , 定位到函数内, ( 如果bug是因为SIGSEGV , 那么找出哪个变量的访问发生了SIGSEGV, 并且确定出何时这个变量不能被access了)

5.通过搜集到的信息写出POSIX C 的测试样例 重现此bug (此时应该结合Google man page 以及各种资料 找出你要使用的函数的用法,以及作用)

7.进一步研究自己写好的测试样例, 用 RELAY日志把程序运行时的系统日志收集到

–  根据要记录的日志的模块的不同 WINEDEBUG后加不同的参数 , 不过所有的都要 WINEDEBUG=+relay,+tid,+server , 而且要注意 server加上后 ,先执行

wineserver -k 然后再启动你要调试的程序 ,server的日志只有在第一个wine的进程启动时,启动server才会记录 , 关于这些参数的意义 +relay表示输出relay日志 , +tid表示打印日志的时候带有线程号 , +server表示i记录下server的详细日志

– 得到日志之后 需要对日志进行处理,才能获得有用的信息 ,处理方法如下

6.进一步将调用的细节确定下来

– 编译安装MSYS2-runtime的代码,要有 -g 参数 (如果编译完成不了的话,甚至源码无法get到的话 ,请看第三步)

(这里要注意一点: 如果某个参数是一个指针 ,要记录下来这个指针指向的内容的各个参数 , 而不是仅仅记录这个地址)

7.写出WinAPI版本的测试用例


Linux, wine C. Linux, kernel, Laravel, PHP, Python, Shell, Web, wine


Historical Comments

Post navigation ————— NEXT
CSAPP Linking 学习总结
PREVIOUS CF 543A Writing Code 完全背包问题

Back