以下是一个简短的实例:
环境:
Ubuntu 11.10
问题:
1. 从官方源安装 Libreoffice 3.4.4
2. 删除 Libreoffice 3.4.4
3. 添加 Libreoffice ppa 源
4. 从ppa源安装 Libreoffice 3.5.1
5. 删除 Libreoffice 3.5.1
6. 禁用 ppa源
7. 重新从官方源安装 Libreoffice 3.4.4
到这里, Libreoffice便再也无法成功启动, 每次都是一闪而过就退出了.
如何调试呢? 一种思路是下载代码, 然后编译, 然后gdb调试, 不过我觉得这样太可怕了.
尤其这个问题很可能跟打包有关, 自己编译的不一定能重现 (后来证实确实跟打包有关)
因此我最终选择的思路是利用strace进行追踪.
运行 $ strace libreoffice
最后几行输出如下:
-- snip ---
open("/usr/bin/libreoffice", O_RDONLY) = 3
fcntl64(3, F_DUPFD, 10) = 10
close(3) = 0
fcntl64(10, F_SETFD, FD_CLOEXEC) = 0
rt_sigaction(SIGINT, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGINT, {0x8056130, ~[RTMIN RT_1], 0}, NULL, 8) = 0
rt_sigaction(SIGQUIT, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL, ~[RTMIN RT_1], 0}, NULL, 8) = 0
rt_sigaction(SIGTERM, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGTERM, {SIG_DFL, ~[RTMIN RT_1], 0}, NULL, 8) = 0
read(10, "#!/bin/sh\n/usr/lib/libreoffice/p"..., 8192) = 53
clone(child_stack=0,
flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,
child_tidptr=0xb7641938) = 14235
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14235
--- SIGCHLD (Child exited) @ 0 (0) ---
read(10, "", 8192) = 0
exit_group(0) = ?
--- snip ---
这里观察到 "--- SIGCHLD (Child exited) @ 0 (0) ---", 子进程退出了.
疑问1: 这个子进程做什么事情?
疑问2:
read(10, "#!/bin/sh\n/usr/lib/libreoffice/p"..., 8192) = 53
这一行做了什么事情?
man strace, 找到 -s 参数, 可以指定显示的字符串的长度, 重新strace一遍:
$ strace -s 100 libreoffice
...
read(10, "#!/bin/sh\n/usr/lib/libreoffice/program/soffice \"$@\"\n", 8192) = 53
...
干脆直接strace /usr/lib/libreoffice/program/soffice :
看到这一行:
execve("/usr/lib/libreoffice/program/oosplash.bin",
["/usr/lib/libreoffice/program/oos"...], [/* 46 vars */]) = 0
从名字猜测, oosplash.bin应该就是显示启动画面的程序
这时候, 对疑问1和疑问2做出如下猜测:
oosplash.bin显示一个启动画面, 同时fork出一个子进程, 子进程就是libreoffice真正的主程序.
继续man strace, 发现 -f 参数, 可以追踪子进程, 追踪后证实确实是如此.
在子进程的strace日志中发现这一行很可疑:
[pid 14318] open("/usr/lib/libreoffice/basis3.4/program/services.rdb",
O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
于是查看一下这个文件:
$ file /usr/lib/libreoffice/basis3.4/program/services.rdb
/usr/lib/libreoffice/basis3.4/program/services.rdb: broken symbolic
link to `/var/lib/libreoffice/basis3.4/program/services.rdb'
这是一个损坏的符号链接, 到这里可以看到疑点更重了.
$ dpkg -S /usr/lib/libreoffice/basis3.4/program/services.rdb
libreoffice-core: /usr/lib/libreoffice/basis3.4/program/services.rdb
原来这个文件是 libreoffice-core提供的
$ sudo apt-get install --reinstall libreoffice-core
重新安装配置这个包.
最后: 成功启动libreoffice!
以上问题已经报告为 https://bugs.launchpad.net/ubuntu/+source/libreoffice/+bug/966172
具体算不算bug我也不太清楚, 我不清楚ppa源是否有义务做到和官方源完全兼容, 这个
得打包党来解释了 :)
抛砖引玉, 除了使用strace, 大家有其他思路吗? 欢迎交流.
--
Regards,
Qian Hong
-
Sent from Ubuntu
http://www.ubuntu.com/
strace命令可以用来跟踪一个程序的系统调用, 类似的还有ltrace, 可以用来跟踪库函数调用.
详细用法可以man一下.
抛砖引玉, 除了使用strace, 大家有其他思路吗? 欢迎交流.
--
Regards,
Qian Hong
-
Sent from Ubuntu
http://www.ubuntu.com/
--
您收到此邮件是因为您订阅了 Google 网上论坛的“广州 GNU/Linux 用户组”论坛。
要向此网上论坛发帖,请发送电子邮件至 gz...@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 gzlug+un...@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/gzlug?hl=zh-CN 访问此网上论坛。

很详细,受益良多,谢谢分享,^_^在 2012年3月28日 上午12:55,Qian Hong <frac...@gmail.com>写道:strace命令可以用来跟踪一个程序的系统调用, 类似的还有ltrace, 可以用来跟踪库函数调用.
详细用法可以man一下.
抛砖引玉, 除了使用strace, 大家有其他思路吗? 欢迎交流.
http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html
做运维的筒子应该经常用strace吧。。。
--------------------
bangerlee
感谢bangerlee兄的分享 :)
bangerlee兄的文章是玉,我这个例子只是砖, 看看bangerlee的文章可以学到很多.
另外, 建议喜欢折腾的朋友可以strace一下strace, strace一下ltrace, strace一下gdb等等 :)
更新:
1. 原bug report已经被标记为invalid, 因为ppa不属于ubuntu官方支持范围.
摘录部分说明:
---
fracting, thank you for taking the time to report this bug and trying
to help make Ubuntu better. However, the LibreOffice PPA is not a
software package provided by the official Ubuntu repositories. Because
of this the Ubuntu project can not support or fix your particular bug.
Please report this bug to the provider of the software package.
Thanks!
If you are interested in learning more about software repositories and
Ubuntu the following pages should be informative:
1. http://www.ubuntu.com/project/about-ubuntu/components - information
about Ubuntu repositories
2. https://help.ubuntu.com/community/Repositories - information
regarding managing repositories
---
2. 已经将bug转交给ubuntu libreoffice packaging team. 接下来什么情况还不清楚.
我们可以把观测一个bug的生命周期当作一次实验 :)
謝謝分享,學習了。
Shou Ya
strace命令可以用来跟踪一个程序的系统调用, 类似的还有ltrace, 可以用来跟踪库函数调用.
详细用法可以man一下.