Stackcore文件堆栈信息解析工具使用指南(stackview.sh脚本)
功能介绍
Stackcore文件主要是用来保存链接了libstackcore.so的进程(例如slogd、adda、tsdaemon、aicpu_scheduler进程)的堆栈信息,当进程出现异常时,需先获取Stackcore文件,再借助CANN提供的stackview.sh脚本解析Stackcore文件中的堆栈信息,以便协助进一步定位出问题。
- Stackcore文件目录:Stackcore文件在Device侧生成,默认保存在“/var/log/npu/coredump”目录或其子目录下。
- stackview.sh脚本目录:{Toolkit包install_path}/toolkit/tools/stacktrace/scripts
stackview.sh脚本调用Linux系统自带的addr2line功能对Stackcore文件进行异常堆栈信息解析。
场景
使用说明
Ascend EP模式
支持推理场景
支持训练场景
若需借助Stackcore文件定位问题,需先登录Host侧服务器,使用msnpureport工具将Stackcore文件从Device导出到Host的“/var/log/npu/report/*/stackcore”目录下,再将Host侧的Stackcore文件上传至stackview.sh脚本所在的环境。
msnpureport工具的使用,请参见。
Ascend RC模式
支持推理场景
登录运行环境,执行scp命令将Device侧的Stackcore文件传输至stackview.sh脚本所在的环境。
使用约束
- 仅支持aarch64压fp的场景,链接了libstackcore.so的进程的异常堆栈信息导出。
- stackview.sh依赖readelf进行文件信息的获取、依赖addr2line进行堆栈函数名和行号的解析,两者都是linux系统自带工具,请确保readelf、addr2line已安装且执行该脚本的用户有权限执行。
- 堆栈深度限制:堆栈信息只打印堆栈从上往下20层,超过20层只打印20层数据。
- 文件大小:20层 * 512Byte + 2KByte(其余及预留)(12KByte)。
Stackcore文件解析步骤
- 登录已安装Toolkit包的环境,切换至stackview.sh脚本所在目录,即{Toolkit包install_path}/toolkit/tools/stacktrace/scripts目录。
- 使用运行用户执行stackview.sh脚本。
通过stackview.sh脚本调用Linux系统自带的readelf功能获取文件信息、addr2line功能对Stackcore文件进行异常堆栈信息解析。
- 命令行格式如下:
bash stackview.sh -c {stackcore_file_path/stackcore_file_name} -p {binary_file_path}
- 命令参数说明如下:
- stackcore_file_path/stackcore_file_name:stackcore文件所在目录及文件名。其中stackcore_file_name命名方式为stackcore.<execname>.<pid>.<signo>.<timestamp>
- execname:可执行文件名。
- pid:进程编号。
- signo:信号值。
- timestamp:时间戳。
- binary_file_path:可执行文件及依赖的so文件所在目录。
- 可执行文件需要从产生该stackcore文件的Device侧获取,如果不是从Device侧环境上获取,可能会解析失败。如果Device侧的可执行文件编译时进行了strip,需要取相同版本没有strip的可执行文件代替。
- so文件所在目录可以在可执行文件所在目录下执行ldd binary_file(可执行文件名)命令获取。如下图所示。
图1 so文件目录获取
- 需要将可执行文件和so文件从Device侧拷贝到host侧并放在同一目录下。
- stackcore_file_path/stackcore_file_name:stackcore文件所在目录及文件名。其中stackcore_file_name命名方式为stackcore.<execname>.<pid>.<signo>.<timestamp>
- 命令行格式如下:
Stackcore文件解析示例
请使用安装时配置的运行用户执行命令,命令示例如下,解析结果示例如图2。
bash stackview.sh -c ${HOME}/stackcore/dev-os-3/stackcore.slogd.3049.11.16249611947 -p ./
打印内容分别是函数名、文件名、行号。

当代码中存在内联函数或宏定义函数,则这2类函数不会打印堆栈调用关系。
如果解析结果是??:?,原因为用户使用了非调试版本的可执行文件(即编译时进行了strip)作为stackview.sh的输入。
信号情况列表
信号名称 |
信号值 |
信号描述 |
stackcore文件 |
---|---|---|---|
SIGABRT |
6 |
Abort signal from abort |
支持 |
SIGBUS |
7 |
Bus error (bad memory access) |
支持 |
SIGFPE |
8 |
Floating-point exception |
支持 |
SIGILL |
4 |
Illegal Instruction |
支持 |
SIGIOT |
6 |
IOT trap. A synonym for SIGABRT |
支持 |
SIGQUIT |
3 |
Quit from keyboard |
支持 |
SIGSEGV |
11 |
Invalid memory reference |
支持 |
SIGSYS |
31 |
Bad system call (SVr4) |
支持 |
SIGTRAP |
5 |
Trace/breakpoint trap |
支持 |
SIGUNUSED |
31 |
Synonymous with SIGSYS |
支持 |
SIGXCPU |
24 |
CPU time limit exceeded |
支持 |
SIGXFSZ |
25 |
File size limit exceeded |
支持 |
异常情况
执行stackview.sh脚本后,显示空行,无结果数据。出现这种情况的可能原因是stackcore内容不正确,例如文件内容无效,堆栈为空等。