# Author: o3-mini
# (这个代码写得并不好)
# 先在 main 处设置断点,并启动程序
break main
run
python
import gdb
import json
import re
def get_stack_state():
"""
返回一个列表,每项为一个帧的状态,格式为字典:
{"function": 函数名, "locals": {变量: 值, ...} }
从 main 开始(call stack 底部)到当前最新的帧。
注:仅提取 gdb 能获取到的局部变量,不包含参数。
"""
state = []
# 从最新帧往上遍历
frame = gdb.newest_frame()
while frame is not None:
try:
fname = frame.name() or "??"
if '__' in fname:
break
local_vars = {}
# 使用 frame.block 遍历变量(注意:可能包含块内变量)
block = frame.block()
while block:
for symbol in block:
if symbol.is_variable or symbol.is_argument:
try:
# 尝试读取变量值
v = symbol.value(frame)
if hasattr(v, 'address'):
if v.address > 0x6fffffffffff:
local_vars[symbol.print_name] = str(v)
elif not state:
local_vars[symbol.print_name] = str(v)
except Exception:
pass
block = block.superblock
state.append({"function": fname, "locals": local_vars})
except Exception:
pass
frame = frame.older()
state.reverse()
# 只保留从 main 开始的帧(假设 main 为入口)
for i, frame_info in enumerate(state):
if frame_info["function"] == "main":
return state[i:]
return state
def format_state(state):
"""
将给定的 call stack 状态格式化成一行文本,
每个帧格式为:函数名: {var1=val1, var2=val2}
多帧之间用 " / " 分隔。
"""
lines = []
for frame in state:
# 将局部变量按“变量=值”拼接为逗号分隔的字符串
locals_str = "
".join(f"{k} = {v}" for k,v in frame["locals"].items())
lines.append(locals_str)
return "