调试XV6时GDB进入trampoline函数报错,无法追踪汇编执行路径
解决XV6调试中GDB无法追踪trampoline.S汇编的问题
问题原因
usertrapret()通过函数指针跳转到trampoline.S的userret标签时,GDB报错"Cannot find bounds of current function",本质是因为汇编文件里的userret仅作为代码标签存在,没有被标记为函数符号,GDB无法识别其函数边界,导致无法正常追踪。
解决步骤
给汇编标签添加函数类型标记
打开kernel/trampoline.S,在userret标签前添加汇编指令,标记它为函数:.type userret, @function userret: # 原有的userret汇编代码同理,如果需要追踪
uservec等其他标签,也可以添加同样的标记。重新编译内核
执行以下命令清理旧编译产物并重新构建带调试信息的内核:make clean && make qemu-gdb调试时的替代技巧
如果不想修改汇编代码,也可以提前在userret处设置断点:break userret当执行到
((void (*)(uint64, uint64))fn)(TRAPFRAME, satp);前,执行continue就能直接跳转到userret的汇编代码,之后用stepi即可正常追踪。
内容的提问来源于stack exchange,提问作者VEGETABLE12345
相关产品推荐
相关产品推荐

