You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
工作内容
1. 边界断点相关问题
下面是工作具体阐述:
上一次说的变量优化的问题并不是造成调试失败的主要原因,在当前来看,hook根本就没有触发,并且user_to_kernel就没成功,虽然引入了detraction属性。
通过检查相关逻辑,核心问题是:OSStatus = user 时,OS切换到内核态时触发 handle_syscall 边界断点,此时PC已经在kernel了,不需要单步到kernel,而是直接切换成kernel,但是user态我们并没有实现AT_KERNEL 处理器(让OSStatus=kernel,切换断点组),导致断点组切换失败。
所以解决这个问题即可,即在user态实现 AT_KERNEL 处理器。
紧接着,还有另一个问题,看通知顺序,handle_system并没有被触发,由于兜底行为才成功切换了OSStatus。
具体来说: debug-ready 时遍历 functionBorderNames,对每个函数名调用 addBreakPoint,然后把 gdbNumber 存回 getCurrentBreakpointGroup().borders 里对应的 Border 对象。但是getCurrentBreakpointGroup() 此时是 kernel 组,所以 gdbNumber 只存到了 kernel 组的 Border 对象里。
上面关于边界断点的bug解决后,通过通知检查,边界断点成功注入,并完成断点组切换。
2. hook 断点 getStringVariable('path') 失败
详见:hook 行为函数难点解决.md
3. launch.json的断点组返回配置问题
调试 StarryOS 时,用户程序断点无法命中。
调试过程:
之间切换无误。
会议内容
调试速查表:状态机变量含义
OSStates(状态)
kernelkernel_single_step_to_useruseruser_single_step_to_kernelOSEvents(事件)
STOPPEDAT_KERNELAT_KERNEL_TO_USER_BORDERAT_USERAT_USER_TO_KERNEL_BORDERDebuggerActions(动作)
check_if_kernel_yetcheck_if_user_yetcheck_if_kernel_to_user_border_yetcheck_if_user_to_kernel_border_yetstart_consecutive_single_stepslow_level_switch_breakpoint_group_to_high_levelhigh_level_switch_breakpoint_group_to_low_leveltry_get_next_breakpoint_group_namecheck_stop_in_kernel状态转换图
调试时常用监视表达式
OSStates[state.status]OSEvents[event.type]state.statusevent.typenextStateNode.targetOSStates[nextStateNode.target]nextStateNode.actionsAll reactions