Linux 程序运行与调试笔记

本文总结了在 Linux 系统中,排查程序运行异常、崩溃、环境变量错误等问题时常用的调试方式与分析工具。

内容涵盖从 D-Bus 调试到进程分析、日志查看、内存排错等多个层面。


一、使用 dbus-send 查询 D-Bus 状态

在使用如 fcitx5Plasma 等依赖 D-Bus 的组件时,常需要查看其在 D-Bus 总线上的运行状态。

示例命令:

dbus-send --print-reply=literal --dest=org.fcitx.Fcitx5 /controller org.fcitx.Fcitx.Controller1.DebugInfo

输出示例:

Group [x11::1] has 0 InputContext(s)
Group [wayland:] has 5 InputContext(s)
  IC [a50fe208d42e4611b240c0b66a2fa0b9] program:konsole frontend:dbus cap:e001800060 focus:1
  IC [d7d4d5c05e9c445aab1af9c7dfb5fbd4] program:telegram-desktop frontend:dbus cap:e001800060 focus:0
  IC [ac72ec3edf58481bbdf838352520efd5] program:krunner frontend:dbus cap:e001820060 focus:0
  IC [d8b450176e204953837248f786204c29] program:plasmashell frontend:dbus cap:e001800060 focus:0
  IC [df252979343d42ebbe9bd82ead6ff194] program: frontend:wayland cap:40 focus:0
Input Context without group

分析: 出现了 telegram-desktop 的那一行,说明 Telegram 仍在使用输入法模块(IM Module),这表明环境变量配置可能存在问题(例如 Wayland 下的 QT_IM_MODULE 未正确传递)。


二、使用 /proc 查看程序运行时环境变量

在 Linux 中,程序运行时的环境变量可以通过 /proc/<PID>/environ 查看。

[!Tip] 可以通过 pgrep 来查看 process_name 的 PID

示例:

cat /proc/<PID>/environ | tr '\0' '\n'

若只想查看输入法相关变量:

tr '\0' '\n' < /proc/<PID>/environ | grep -E 'WAYLAND_DISPLAY|XMODIFIERS|QT_IM_MODULE|GTK_IM_MODULE'

此方法可快速判断程序是否继承了正确的输入法或显示环境变量。


三、常用系统级调试与诊断手段

当程序报错、崩溃或运行异常时,可以从以下几个层面逐步排查。


1. strace —— 系统调用级调试

跟踪程序运行时的系统调用(文件访问、网络、信号等)。

strace -f -o trace.log program_name

查看关键错误:

grep -i 'ENOENT\|EACCES' trace.log

用途:

  • 定位文件找不到(No such file)
  • 权限问题(Permission denied)
  • 系统调用失败的具体原因

2. ltrace —— 动态库函数调用跟踪

跟踪程序使用的动态库函数调用(如 glibc、Qt 等)。

ltrace -o ltrace.log program_name

用途:

  • 分析函数调用关系
  • 观察外部库加载问题
  • 调用参数追踪

3. gdb —— 程序崩溃分析

进入交互式调试器:

gdb program_name
(gdb) run
(gdb) bt    # 打印崩溃堆栈

分析已生成的 core dump:

ulimit -c unlimited      # 启用 core dump
./program_name
gdb program_name core
(gdb) bt

用途:

  • 精确定位崩溃行号与函数调用链
  • 手动调试运行流程

4. journalctl / dmesg —— 查看系统日志

查看 systemd 日志:

journalctl -xe | grep program_name

查看内核日志:

dmesg | tail -n 30

用途:

  • 捕获 Segmentation fault、abort、权限拒绝
  • 发现驱动层或权限层错误

5. ps / top / htop / pmap —— 查看进程状态与内存分布

ps aux | grep program_name
top -p <PID>
pmap <PID>

用途:

  • 判断程序是否卡死、CPU 过高
  • 检查内存分布和泄漏趋势

6. lsof —— 查看文件与端口占用

查看进程打开的文件或端口:

lsof -p <PID>
lsof -i :8080

用途:

  • 排查文件被占用
  • 检查端口冲突、资源锁定问题

7. systemctl status —— 调试 systemd 服务

若程序由 systemd 管理(如 fcitx5-daemon):

systemctl status fcitx5.service -l
journalctl -u fcitx5.service

用途:

  • 查看服务启动失败原因
  • 分析日志输出与崩溃情况

8. env / printenv —— 检查环境变量

查看当前 shell 的环境变量:

env | grep -E 'IM_MODULE|WAYLAND|DISPLAY'

用途:

  • 检查输入法、图形环境、DBus 环境传递是否正确

9. valgrind —— 检查内存问题

检测内存泄漏与非法访问:

valgrind --leak-check=full ./program_name

用途:

  • 内存越界、未释放的内存检测
  • 定位 malloc/free 不匹配问题

10. coredumpctl —— 查看崩溃记录(systemd 管理)

当程序崩溃时:

coredumpctl list
coredumpctl info <PID>
coredumpctl gdb <PID>

用途:

  • 查看崩溃历史
  • 直接进入 GDB 分析 core dump

四、常用工具速查表

调试目标 工具 说明
系统调用跟踪 strace 调用系统级操作
动态库函数 ltrace 调用 libc、Qt 等库函数
程序崩溃调试 gdb, coredumpctl 堆栈分析、现场回溯
内存错误检测 valgrind 内存泄漏与越界
进程与资源状态 ps, top, htop, pmap 查看资源使用
文件/端口占用 lsof 分析文件锁或端口冲突
系统日志 journalctl, dmesg 系统与内核层错误信息
环境变量检查 /proc/<PID>/environ, env 检查 Wayland/X11 变量
D-Bus 调试 dbus-send, busctl 检查输入法、桌面通信状态

五、小结

在 Linux 环境中,调试往往不依赖单一工具,而是通过以下顺序综合使用:

  1. 观察行为: journalctldmesg
  2. 确认环境: /proc/<PID>/environenv
  3. 跟踪系统层: straceltrace
  4. 内核与崩溃层面: gdbcoredumpctl
  5. 资源与文件: pslsoftop
  6. 复杂问题: valgrind(内存类)

通过这些手段的组合,可以完整地排查几乎所有 Linux 用户态程序的运行异常与崩溃问题。