Skip to content

Commit ff7937d

Browse files
committed
审查各种版本lua的调试问题
1 parent be16291 commit ff7937d

File tree

4 files changed

+51
-16
lines changed

4 files changed

+51
-16
lines changed

emmy_debugger/src/emmy_debugger_manager.cpp

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ EmmyDebuggerManager::EmmyDebuggerManager()
88
stateStepOver(std::make_shared<HookStateStepOver>()),
99
stateStop(std::make_shared<HookStateStop>()),
1010
stateStepIn(std::make_shared<HookStateStepIn>()),
11-
stateStepOut(std::make_shared<HookStateStepOut>())
11+
stateStepOut(std::make_shared<HookStateStepOut>()),
12+
isRunning(false)
1213
{
1314
}
1415

@@ -49,7 +50,18 @@ std::shared_ptr<Debugger> EmmyDebuggerManager::AddDebugger(lua_State* L)
4950
}
5051
else
5152
{
52-
debugger = std::make_shared<Debugger>(nullptr, shared_from_this());
53+
// 如果首次add 的state不是main state,则main state视为空指针
54+
// 但不影响luajit附加调试和远程调试
55+
lua_State* mainState = nullptr;
56+
57+
int ret = lua_pushthread(L);
58+
lua_pop(L, 1);
59+
if (ret == 1)
60+
{
61+
mainState = L;
62+
}
63+
64+
debugger = std::make_shared<Debugger>(mainState, shared_from_this());
5365
}
5466
debuggers.insert({identify, debugger});
5567
}
@@ -216,20 +228,36 @@ void EmmyDebuggerManager::Eval(std::shared_ptr<EvalContext> ctx)
216228

217229
void EmmyDebuggerManager::OnDisconnect()
218230
{
231+
SetRunning(false);
219232
std::lock_guard<std::mutex> lock(debuggerMtx);
220233
for (auto it : debuggers)
221234
{
222235
it.second->Stop();
223236
}
224-
if (luaVersion == LuaVersion::LUA_JIT)
237+
}
238+
239+
void EmmyDebuggerManager::SetRunning(bool value)
240+
{
241+
std::lock_guard<std::mutex> lock(isRuningMtx);
242+
isRunning = value;
243+
if(isRunning)
225244
{
226-
debuggers.clear();
245+
for(auto debugger: GetDebuggers())
246+
{
247+
debugger->Start();
248+
}
227249
}
228250
}
229251

252+
bool EmmyDebuggerManager::IsRunning()
253+
{
254+
std::lock_guard<std::mutex> lock(isRuningMtx);
255+
return isRunning;
256+
}
257+
230258
EmmyDebuggerManager::UniqueIdentifyType EmmyDebuggerManager::GetUniqueIdentify(lua_State* L)
231259
{
232-
if (luaVersion != LuaVersion::LUA_JIT)
260+
if (luaVersion == LuaVersion::LUA_JIT)
233261
{
234262
// 我们认为luajit只会有一个debugger
235263
return 0;

emmy_debugger/src/emmy_facade.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,8 @@ void EmmyFacade::OnInitReq(const rapidjson::Document& document)
318318
emmyDebuggerManager->extNames = extNames;
319319
}
320320

321+
emmyDebuggerManager->SetRunning(true);
322+
321323
//TODO 这里有个线程安全问题,消息线程和lua 执行线程不是相同线程,但是没有一个锁能让我做同步
322324
// 所以我不能在这里访问lua state 指针的内部结构
323325
//
@@ -328,11 +330,7 @@ void EmmyFacade::OnInitReq(const rapidjson::Document& document)
328330
auto debuggers = emmyDebuggerManager->GetDebuggers();
329331
for (auto debugger : debuggers)
330332
{
331-
debugger->Start();
332-
if (luaVersion != LuaVersion::LUA_JIT)
333-
{
334-
debugger->Attach(false);
335-
}
333+
debugger->Attach(false);
336334
}
337335
}
338336

@@ -611,10 +609,10 @@ void EmmyFacade::Hook(lua_State* L, lua_Debug* ar)
611609
{
612610
debugger = emmyDebuggerManager->AddDebugger(L);
613611
install_emmy_core(L);
614-
// attach的时候能进入这里必然是 connected,所以可以执行start
615-
debugger->Start();
616-
debugger->Attach();
617-
612+
if (emmyDebuggerManager->IsRunning()) {
613+
debugger->Start();
614+
debugger->Attach();
615+
}
618616
// send attached notify
619617
rapidjson::Document rspDoc;
620618
rspDoc.SetObject();

emmy_debugger/src/hook_state.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,11 @@ bool HookStateStop::Start(std::shared_ptr<Debugger> debugger, lua_State* current
179179
if (current == nullptr)
180180
return false;
181181

182-
// 停止调试时,不在更新hook,
183-
// 因为lua_state* 可能已经失效了
182+
// 不能取消当前hook
183+
// 当unity 停止play之后附加调试依然运行,此时lua虚拟机可能已经销毁
184+
// 所以以下操作会导致进程崩溃
184185
// debugger->UpdateHook(0, current);
186+
185187
// 此处会引发递归加锁而报错,而如果使用递归锁对调试体验影响
186188
// debugger->DoAction(DebugAction::Continue);
187189
debugger->SetHookState(debugger->GetEmmyDebuggerManager()->stateContinue);

include/emmy_debugger/emmy_debugger_manager.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ class EmmyDebuggerManager : public std::enable_shared_from_this<EmmyDebuggerMana
6666

6767
void OnDisconnect();
6868

69+
void SetRunning(bool value);
70+
71+
bool IsRunning();
72+
6973
// public 成员放下面
7074
std::shared_ptr<HookStateBreak> stateBreak;
7175
std::shared_ptr<HookStateStepOver> stateStepOver;
@@ -93,4 +97,7 @@ class EmmyDebuggerManager : public std::enable_shared_from_this<EmmyDebuggerMana
9397
std::vector<std::shared_ptr<BreakPoint>> breakpoints;
9498

9599
std::set<int> lineSet;
100+
101+
std::mutex isRuningMtx;
102+
bool isRunning;
96103
};

0 commit comments

Comments
 (0)