Как я могу безопасно сообщить трассировку стека Lua, когда произошел сбой? - PullRequest
1 голос
/ 10 января 2020

Если код, который Lua, вызванный в C ++, содержит недопустимый указатель, может произойти cra sh. Но трассировка без стека содержит только функцию C ++, такую ​​как 'lua_xxxx'. Трудно определить, что произошло без трассировки стека Lua.

Я хочу сообщить трассировку стека Lua нашему серверу в случае сбоя клиента. Но есть некоторые проблемы, в которых я не совсем уверен.

  1. Если куча или стек испорчены неправильной записью в память, как я могу безопасно прочитать трассировку стека Lua без вторичного кратера? sh?
  2. Обычно функция обработчика cra sh вызывается в другом процессе. Безопасно ли получить Lua VM из основного потока?

Я пытаюсь получить Lua VM в обработчике Cra sh и использовать следующий код:

luaL_traceback(L, L, NULL, 1);
const char* s = lua_tostring(L, -1);

Но в некоторых случаях это вызовет вторичный взлом sh.

Альтернативный план, о котором я думаю, состоит в том, чтобы читать необработанную память стека Lua с точкой + смещение или выгружать информацию стека в определенный раздел c памяти при каждом вызове Lua. Но оба они не идеальны. Они приведут к дополнительным потерям производительности или потенциальным рискам sh.

...