eu-stack命令用法及示例

eu-stackelfutils 工具集的一部分,用于获取正在运行进程或核心转储文件(core dump)的堆栈跟踪信息。它比 pstack 更高效,尤其适合生产环境调试。以下是详细用法和示例:


基本语法

1
2
eu-stack [选项] <pid>       # 分析运行中的进程
eu-stack [选项] -c <core> -e <executable> # 分析核心转储文件

常用选项

选项 说明
-p <pid> 指定目标进程的 PID
-c <core> 指定核心转储文件
-e <executable> 指定可执行文件(分析 core 时必需)
-n 跳过系统调用帧(只显示用户空间栈)
-s 包含系统调用帧(默认)
-l 显示源代码行号(需调试符号)
-q 安静模式(减少输出)
-r 显示原始地址(不解析符号)

示例场景

1. 获取运行中进程的堆栈

1
eu-stack -p 1234

输出示例

1
2
3
4
5
#0  0x00007f9a5e0d5f0d in nanosleep () from /lib64/libc.so.6
#1 0x00007f9a5e0d5d84 in sleep () from /lib64/libc.so.6
#2 0x0000000000401156 in worker_thread () at demo.c:15 # 显示源代码行号
#3 0x00007f9a5e6cea27 in start_thread () from /lib64/libpthread.so.0
#4 0x00007f9a5e1a5d10 in clone () from /lib64/libc.so.6

2. 分析核心转储文件

1
eu-stack -e ./myapp -c core.1234

输出示例

1
2
3
#0  0x00007f4b3a9214d5 in raise () from /lib64/libc.so.6
#1 0x00007f4b3a90c8a4 in abort () from /lib64/libc.so.6
#2 0x0000000000401172 in crash () at crash.c:8 # 定位崩溃点

3. 跳过系统调用帧

1
eu-stack -p 1234 -n

输出(省略内核调用):

1
2
#0  0x0000000000401156 in worker_thread () at demo.c:15
#1 0x00007f9a5e6cea27 in start_thread () from /lib64/libpthread.so.0

4. 显示源代码行号

1
eu-stack -p 1234 -l

输出(需编译时加 -g 选项):

1
2
#2  0x0000000000401156 in worker_thread () at demo.c:15
源码位置:demo.c 第 15 行

5. 仅显示原始地址

1
eu-stack -p 1234 -r

输出(不解析符号):

1
2
3
#0  0x00007f9a5e0d5f0d
#1 0x00007f9a5e0d5d84
#2 0x0000000000401156

常见问题解决

  1. 权限不足
    使用 sudo 执行:

    1
    sudo eu-stack -p 1234
  2. 缺少调试信息
    编译程序时添加 -g 选项:

    1
    gcc -g myapp.c -o myapp
  3. 核心转储分析失败
    确保核心文件和可执行文件匹配:

    1
    eu-stack -e /path/to/myapp -c /path/to/core.1234

工具安装

  • Debian/Ubuntu:
    1
    sudo apt install elfutils
  • RHEL/CentOS:
    1
    sudo yum install elfutils

提示:eu-stack 对进程影响极小,适合生产环境诊断死锁、卡顿等问题。