)
+@in_gdb_thread
+def _objfile_removed(event):
+ if is_module(event.objfile):
+ send_event(
+ "module",
+ {
+ "reason": "removed",
+ "module": make_module(event.objfile),
+ },
+ )
+
+
_suppress_cont = False
gdb.events.thread_exited.connect(_thread_exited)
gdb.events.cont.connect(_cont)
gdb.events.new_objfile.connect(_new_objfile)
+gdb.events.free_objfile.connect(_objfile_removed)
return
}
-set obj [dap_check_request_and_response "set breakpoint on two functions" \
+set obj [dap_check_request_and_response "set breakpoint on stop function" \
setFunctionBreakpoints \
{o breakpoints [a [o name [s stop]]]}]
set fn_bpno [dap_get_breakpoint_number $obj]
"body reason" breakpoint \
"body hitBreakpointIds" $fn_bpno
-dap_check_request_and_response "continue to next stop" continue \
+dap_check_request_and_response "continue to second stop" continue \
{o threadId [i 1]}
gdb_assert {[string match *$libname* $frame_id]} "module.id in stack trace"
+
+dap_check_request_and_response "continue to third stop" continue \
+ {o threadId [i 1]}
+
+dap_wait_for_event_and_check "module removed event" module \
+ "body reason" removed
+
+dap_wait_for_event_and_check "third stop at function breakpoint" stopped \
+ "body reason" breakpoint \
+ "body hitBreakpointIds" $fn_bpno
+
dap_shutdown