vadimcn / codelldb

A native debugger extension for VSCode based on LLDB
https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb
MIT License
2.42k stars 237 forks source link

Reduce exception raised from python scripts #1082

Open ZequanWu opened 3 months ago

ZequanWu commented 3 months ago

codelldb often crashes because of exceptions raised from python scripts. For example:

[DEBUG codelldb::dap_codec] --> {"command":"evaluate","arguments":{"expression":"TimeTraceProfilerEntry","frameId":1262,"context":"hover"},"type":"request","seq":187}
ERROR(Python) 11:55:04 codelldb: Traceback (most recent call last):
  File "/usr/local/google/home/zequanwu/.vscode-server/extensions/vadimcn.vscode-lldb-1.10.0/adapter/scripts/codelldb/codelldb.py", line 175, in evaluate
    value = evaluate_in_context(pycode, is_simple_expr, context)
  File "/usr/local/google/home/zequanwu/.vscode-server/extensions/vadimcn.vscode-lldb-1.10.0/adapter/scripts/codelldb/codelldb.py", line 320, in evaluate_in_context
    return eval(code, eval_globals, eval_locals)
  File "<input>", line 1, in <module>
  File "/usr/local/google/home/zequanwu/.vscode-server/extensions/vadimcn.vscode-lldb-1.10.0/adapter/scripts/codelldb/codelldb.py", line 309, in <lambda>
    eval_globals['__eval'] = lambda expr: nat_eval(frame, expr)
  File "/usr/local/google/home/zequanwu/.vscode-server/extensions/vadimcn.vscode-lldb-1.10.0/adapter/scripts/codelldb/codelldb.py", line 300, in nat_eval
    raise Exception(err.GetCString())
Exception: error: <user expression 3>:1:1: use of undeclared identifier 'TimeTraceProfilerEntry'
    1 | TimeTraceProfilerEntry
      | ^

[ERROR codelldb::debug_session] error: <user expression 3>:1:1: use of undeclared identifier 'TimeTraceProfilerEntry'
        1 | TimeTraceProfilerEntry
          | ^

[DEBUG codelldb::dap_codec] <-- {"seq":236,"type":"response","request_seq":187,"success":false,"command":"","message":"error: <user expression 3>:1:1: use of undeclared identifier 'TimeTraceProfilerEntry'\n    1 | TimeTraceProfilerEntry\n      | ^\n","show_user":true}
[DEBUG codelldb::dap_codec] --> {"command":"evaluate","arguments":{"expression":"llvm","frameId":1262,"context":"hover"},"type":"request","seq":188}
Received signal: SIGSEGV
   0: codelldb::hook_crashes::handler
   1: <unknown>
   2: <unknown>
   3: <unknown>
   4: <unknown>
   5: <unknown>
   6: <unknown>
   7: <unknown>
   8: <unknown>
   9: <unknown>
  10: <unknown>
  11: <unknown>
  12: <unknown>
  13: <unknown>
  14: <unknown>
  15: <unknown>
  16: <unknown>
  17: <unknown>
  18: <unknown>
  19: <unknown>
  20: <unknown>
  21: <unknown>
  22: <unknown>
  23: <unknown>
  24: <unknown>
  25: <unknown>
  26: <unknown>
  27: <unknown>
  28: <unknown>
  29: <unknown>
  30: <unknown>
  31: <unknown>
  32: <unknown>
  33: <unknown>
  34: <unknown>
  35: <unknown>
  36: <unknown>
  37: <unknown>
  38: _ZN4lldb7SBFrame18EvaluateExpressionEPKcRKNS_19SBExpressionOptionsE
  39: _ZN4lldb7SBFrame18EvaluateExpressionEPKc
  40: <unknown>
  41: <unknown>
  42: _PyObject_Call
  43: _PyEval_EvalFrameDefault
  44: <unknown>
  45: _PyFunction_Vectorcall
  46: <unknown>
  47: <unknown>
  48: _PyEval_EvalFrameDefault
  49: _PyFunction_Vectorcall
  50: <unknown>
  51: _PyEval_EvalFrameDefault
  52: <unknown>
  53: _PyFunction_Vectorcall
  54: <unknown>
  55: _PyEval_EvalFrameDefault
  56: <unknown>
  57: PyEval_EvalCode
  58: <unknown>
  59: <unknown>
  60: <unknown>
  61: _PyEval_EvalFrameDefault
  62: <unknown>
  63: _PyFunction_Vectorcall
  64: <unknown>
  65: _PyEval_EvalFrameDefault
  66: _PyFunction_Vectorcall
  67: <unknown>
  68: <unknown>
  69: <unknown>
  70: <unknown>
  71: codelldb::python::PythonInterface::evaluate
  72: codelldb::debug_session::variables::<impl codelldb::debug_session::DebugSession>::evaluate_expr_in_frame
  73: codelldb::debug_session::variables::<impl codelldb::debug_session::DebugSession>::handle_evaluate_expression
  74: codelldb::debug_session::variables::<impl codelldb::debug_session::DebugSession>::handle_evaluate
  75: codelldb::debug_session::DebugSession::handle_request
  76: tokio::runtime::task::core::Core<T,S>::poll
  77: tokio::runtime::task::harness::Harness<T,S>::poll
  78: tokio::task::local::LocalSet::tick
  79: std::thread::local::LocalKey<T>::with
  80: <tokio::task::local::LocalSet as core::future::future::Future>::poll
  81: codelldb::run_debug_session::{{closure}}
  82: tokio::runtime::context::blocking::BlockingRegionGuard::block_on
  83: tokio::runtime::context::runtime::enter_runtime
  84: codelldb::debug_server
  85: codelldb::main
  86: std::sys_common::backtrace::__rust_begin_short_backtrace
  87: std::rt::lang_start::{{closure}}
  88: std::rt::lang_start_internal
  89: main
  90: __libc_start_call_main
             at ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
  91: __libc_start_main_impl
             at ./csu/../csu/libc-start.c:360:3
  92: _start

Debug adapter exit code=255 (0xff), signal=null.

This is caused by a failed evaluate request. Instead of raising exception from python, can we just return the error string from the response? This kind of python exception is very common in the code base. Reducing the exceptions could significantly reduce the number of codelldb crashes.