AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 543731
Accepted
Phylliade
Phylliade
Asked: 2019-09-26 13:00:04 +0800 CST2019-09-26 13:00:04 +0800 CST 2019-09-26 13:00:04 +0800 CST

如何从 coredump 重建堆栈跟踪?

  • 772

coredumpctl创建 coredump 后,该实用程序会显示程序的堆栈跟踪。

例如,在 Firefox 核心转储上:

Stack trace of thread 14469:
#0  0x00007f0ac652d3bd pthread_cond_wait@@GLIBC_2.3.2 (libpthread.so.0)
#1  0x0000560f2ab95488 _ZN7mozilla6detail21ConditionVariableImpl4waitERNS0_9MutexImplE (firefox)
#2  0x0000560f2ab95646 _ZN7mozilla6detail21ConditionVariableImpl8wait_forERNS0_9MutexImplERKNS_16BaseTimeDurationINS_27TimeDurati>
#3  0x00007f0aba9799f9 n/a (libxul.so)
#4  0x00007f0aba96eb9a n/a (libxul.so)
#5  0x00007f0ac652708c start_thread (libpthread.so.0)
#6  0x00007f0ac5abce7f __clone (libc.so.6)

考虑到这是 C 代码,因此它是编译的,符号并没有直接嵌入到二进制文件中:那么这怎么可能呢?
而且,readelf 在实践中是如何做到的?

(我的猜测,这与嵌入在 ELF 文件中的符号表有关)

core-dump
  • 1 1 个回答
  • 679 Views

1 个回答

  • Voted
  1. Best Answer
    icarus
    2019-09-26T15:02:19+08:002019-09-26T15:02:19+08:00

    正如您正确猜测的那样,符号来自嵌入在 ELF 文件中的符号信息。即使不存在完整的符号表,也需要一些符号信息才能进行动态链接。

    就实际的堆栈跟踪而言,当调用函数时,会保存 cpu 返回的位置。对于像 x86 这样的 cpu,它被压入堆栈。对于 RISC 机器,它通常被放入寄存器。如果函数想要调用任何其他函数(即它不是leaf函数)然后这个寄存器被压入堆栈。堆栈跟踪代码在堆栈上找到这些地址,在其前面的符号中查找最近的地址并报告它。一些堆栈跟踪代码会同时打印符号名称和距离,这可以让您对它的准确性更有信心。例如,如果符号在返回地址之前只有 40 个字节,那么与之前的 40,000 个字节相比,人们对它在该代码中的信心要大得多。在后一种情况下,人们可能会怀疑返回地址指向不同的函数,但该函数在符号表中没有条目。

    很多事情都会使这不准确。如果编译器将函数 a 内联到函数 b 中,那么您可能在函数 a 中,但堆栈跟踪会报告您在 b 中。

    如果编译器执行“尾调用优化”,其中函数 a 以类似的结尾return b();并且函数 c 调用函数 a,您可能希望跟踪显示 c->a->b,但您只会看到 c->b。如果您查看 c 的源代码并且您发现它从不直接调用 b,这可能会令人困惑。

    • 1

相关问题

  • 如何转换 Coredump .gz 文件以便我可以阅读它

  • 配置 Linux 核心转储程序以永久存储核心

  • systemd:无法在只读文件系统上创建 coredump

  • 是否可以将程序的内存转储到文件并再次恢复?

  • 如何找到为什么 bash 以信号 11 退出,分段错误

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve