我有一个用例,我的客户有一个核心转储(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)
我想通过获取客户端bt的结果并将其放入我的gdb会话中进行映射来实现相同的输出。
这是做不到的。 GDB中的映射是一个复杂的部分,它需要核心文件exec文件和符号文件一起进行映射。
由于堆栈不会出现在另一侧,因此无法在这里执行任何操作。