Skip to content

Commit 078c4ad

Browse files
authored
Merge pull request #87 from sssooonnnggg/master
Defer Break action to the next line hook when no debugger has hit yet
2 parents 5e9b4ea + d41d3e8 commit 078c4ad

4 files changed

Lines changed: 32 additions & 7 deletions

File tree

emmy_debugger/include/emmy_debugger/debugger/emmy_debugger_manager.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ class EmmyDebuggerManager
4747

4848
void SetHitDebugger(std::shared_ptr<Debugger> debugger);
4949

50+
// 如果当前没有 hit debugger,pause(Break)请求会被挂起到这里,
51+
// 由下一次任意 debugger 的 hook 触发时消费(原子读+清)。
52+
bool ConsumePendingBreak();
53+
5054
bool IsDebuggerEmpty();
5155

5256
void AddBreakpoint(std::shared_ptr<BreakPoint> breakpoint);
@@ -100,6 +104,10 @@ class EmmyDebuggerManager
100104
std::mutex breakDebuggerMtx;
101105
std::shared_ptr<Debugger> hitDebugger;
102106

107+
// pause(Break)请求挂起标记: DoAction(Break) 时若无 hitDebugger 就置位,
108+
// hook 路径上首次进入 line 事件时消费。
109+
std::atomic<bool> pendingBreak{false};
110+
103111
std::mutex breakpointsMtx;
104112
std::vector<std::shared_ptr<BreakPoint>> breakpoints;
105113

emmy_debugger/src/debugger/emmy_debugger.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,17 @@ void Debugger::Hook(lua_Debug *ar, lua_State *L) {
106106
luaThreadExecutors.clear();
107107
}
108108
}
109+
110+
// 处理 pause: 如果 manager 上有挂起的 Break 请求(DoAction(Break)
111+
// 时无 hitDebugger),这里消费一下,把当前 debugger 设为 hitDebugger,
112+
// 然后走原来的 DoAction(Break) 路径设置 hookState = stateBreak。
113+
// 下面读 hookState 时就会拿到 stateBreak, ProcessHook 在当前 LINE
114+
// 事件上立刻命中 HandleBreak。
115+
if (manager->ConsumePendingBreak()) {
116+
manager->SetHitDebugger(shared_from_this());
117+
DoAction(DebugAction::Break);
118+
}
119+
109120
auto bp = FindBreakPoint(ar);
110121
if (bp && ProcessBreakPoint(bp)) {
111122
HandleBreak();

emmy_debugger/src/debugger/emmy_debugger_manager.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,20 @@ void EmmyDebuggerManager::DoAction(DebugAction action)
215215
if (debugger)
216216
{
217217
debugger->DoAction(action);
218+
return;
218219
}
220+
// 还没有 hit debugger: 只有 Break(pause) 在这种情况下有意义,
221+
// 挂起 pending 标记,由下次任意 hook 触发时消费。
222+
// 其它 action(continue/step/stop) 必须在已断下后才有意义,这里直接丢弃。
223+
if (action == DebugAction::Break)
224+
{
225+
pendingBreak.store(true);
226+
}
227+
}
228+
229+
bool EmmyDebuggerManager::ConsumePendingBreak()
230+
{
231+
return pendingBreak.exchange(false);
219232
}
220233

221234
void EmmyDebuggerManager::Eval(std::shared_ptr<EvalContext> ctx)

emmy_debugger/src/emmy_facade.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -334,10 +334,6 @@ void EmmyFacade::Hook(lua_State *L, lua_Debug *ar) {
334334
return;
335335
}
336336

337-
// 没人断着时,把当前活跃 vm 记下来,使未断点过的 pause 能定位到目标
338-
if (!_emmyDebuggerManager.GetHitBreakpoint()) {
339-
_emmyDebuggerManager.SetHitDebugger(debugger);
340-
}
341337
debugger->Hook(ar, L);
342338
} else {
343339
if (workMode == WorkMode::Attach) {
@@ -353,9 +349,6 @@ void EmmyFacade::Hook(lua_State *L, lua_Debug *ar) {
353349

354350
this->transporter->Send(int(MessageCMD::AttachedNotify), obj);
355351

356-
if (!_emmyDebuggerManager.GetHitBreakpoint()) {
357-
_emmyDebuggerManager.SetHitDebugger(debugger);
358-
}
359352
debugger->Hook(ar, L);
360353
}
361354
}

0 commit comments

Comments
 (0)