【问题标题】:Fast ways of accessing core data (via gdb, external library, etc)访问核心数据的快速方法(通过 gdb、外部库等)
【发布时间】:2022-11-16 12:45:13
【问题描述】:

我有一个 gdb python 宏遍历 c 生成的核心文件中的数据。 宏可能需要很长时间才能运行。它遍历结构指针列表,将每个指针读入 gdb.Value。大部分时间花在访问该结构中的第一条数据时。这是由于 gdb.Value 具有的惰性特性。

IE。

gdb_val = other_structure['pointer']

if gdb_val['data1']:   <-- Majority of the time spent here
   do_stuff
   return

if gdb_val['data2']:   <-- This is faster because the data is already loaded
   do_other_stuff

我尝试通过偏移量使用更“直接”访问该数据来访问 data1,但这实际上减慢了宏的速度。

我相信我已经用尽了 python/gdb 的选择。如果我错了,请告诉我。

有没有其他方法可以更快地分析核心文件?

即编写一个将遍历数据的 c 库?我试着用谷歌搜索,但我只找到关于如何分析 c 核心文件的教程。我希望只是我缺乏 google 技能,并且存在类似的东西。 (我看过一些示例代码,其中 python 加载了一个 c 库来解析数据。但是该数据已传递到库中。我还没有看到 c 可以直接访问 gdb 或核心二进制数据的示例)

【问题讨论】:

  • “很长一段时间”是多长时间?有问题的结构的大小是多少?可执行文件/调试信息的大小是多少?实时调试时是否也会发生延迟,或者仅使用核心文件?我们有什么办法可以重现这个问题吗?

标签: python c gdb


【解决方案1】:

有没有其他方法可以更快地分析核心文件?

core 文件在逻辑上只是创建 core 时内存中进程的映像。

您可以使用read() 以您的磁盘允许的速度访问数据。

诀窍是找到在哪里在内存中,您关心的数据是。一旦您知道这一点,在 ELF core 文件中查找该数据就很简单了(您在 ELF 平台上,对吧?)。

遍历 core 中的 LOAD 段(例如使用 http://elfutils.org 中的 libelf),找到“覆盖”您的地址的 LOAD 段,然后从 core 中的偏移量 pt_load.p_offset + address - pt_load.p_vaddr 读取数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    相关资源
    最近更新 更多