使用 gdb 远程调试核心转储文件

问题描述 投票:0回答:1

我有一个用例,我的客户有一个核心转储(10 到 100 GB),我想从我的系统中分析它,因为在调试紧急或情况下,迁移核心转储可能需要大量时间是P1。

我当然可以建立一些通信,我可以在用户系统上远程发出命令,但我无法在客户端传输源文件或符号表。这给我留下了哪些选择?

因此,考虑到我有 2 个 GDB 会话,一个在客户端,包含核心文件,另一个在我这边,包含 exec 文件和符号文件,我可以根据在客户端获得的输出做一些事情,将其带入我的系统吗?并将其与 gdb 会话中存在的符号表 (symtab) 进行映射,以生成详细的输出。例如-

客户系统上的回溯可能会返回 -

(gdb) bt
#0  0x000055e3eb1b92dd in ?? ()
#1  0x0000000700000000 in ?? ()
#2  0x000055e3eb5b22a0 in ?? ()
#3  0x00000007eb5b22a0 in ?? ()
#4  0x0000000000000000 in ?? ()

如果我拥有所有核心文件、符号文件和执行文件,那么回溯将返回 -

(gdb) bt
#0  0x000055e3eb1b92dd in print_list (list=0x55e3eb5b22a0, length=7) at broken_linked_list.c:52
#1  0x000055e3eb1b91db in main () at broken_linked_list.c:19

所以我假设这个映射是在 gdb/symtab.c 中的 struct symtab 的帮助下完成的

我想通过获取客户端bt的结果并将其放入我的gdb会话中进行映射来实现相同的输出。

有办法做到这一点吗?这是否可能,或者有什么方法可以让我远程调试核心文件而不给出 exec 文件和符号文件。

我相对较新,但如果有任何可能的方式,我会准备好深入研究源代码......

我尝试使用 python API,类似这样的东西 - 但实际上无论如何都无法使用它 -

import gdb

def map_addresses_to_symbols(addresses):
    mapped_data = {}
    for address in addresses:
        try:
            # Convert address to hexadecimal string
            address_str = hex(address)
            # Lookup global symbol using the address as a string
            sym = gdb.lookup_global_symbol(address_str)
            if sym is not None:
                symbol_name = sym.name
                mapped_data[address] = symbol_name
        except gdb.error:
            pass
    return mapped_data

def generate_output(mapped_information):
    for address, symbol_name in mapped_information.items():
        print(f"Address: {hex(address)}, Symbol: {symbol_name}")

# Specify the received data from customer machine.. output of bt or anything (addresses that need to be mapped)
received_data = [0x000055e3eb1b92dd] 

# Map addresses to symbols
mapped_information = map_addresses_to_symbols(received_data)

# Generate and print the comprehensive output
generate_output(mapped_information)
python gdb symbols remote-debugging coredump
1个回答
0
投票

我想通过获取客户端bt的结果并将其放入我的gdb会话中进行映射来实现相同的输出。

这是做不到的。 GDB中的映射是一个复杂的部分,它需要核心文件exec文件和符号文件一起进行映射。

由于堆栈不会出现在另一侧,因此无法在这里执行任何操作。

© www.soinside.com 2019 - 2024. All rights reserved.