昇腾社区首页
中文
注册

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文件解析步骤

  1. 登录已安装Toolkit包的环境,切换至stackview.sh脚本所在目录,即{Toolkit包install_path}/toolkit/tools/stacktrace/scripts目录。
  2. 使用运行用户执行stackview.sh脚本。

    通过stackview.sh脚本调用Linux系统自带的readelf功能获取文件信息、addr2line功能对Stackcore文件进行异常堆栈信息解析。

    1. 命令行格式如下:
      bash stackview.sh -c {stackcore_file_path/stackcore_file_name} -p {binary_file_path}
    2. 命令参数说明如下:
      • 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文件解析示例

请使用安装时配置的运行用户执行命令,命令示例如下,解析结果示例如图2

bash stackview.sh -c ${HOME}/stackcore/dev-os-3/stackcore.slogd.3049.11.16249611947 -p ./

图2 Stackcore文件解析结果示例

打印内容分别是函数名、文件名、行号。

当代码中存在内联函数或宏定义函数,则这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内容不正确,例如文件内容无效,堆栈为空等。