@in_gdb_thread
def _catch_exception(filterId, **args):
if filterId in ("assert", "exception", "throw", "rethrow", "catch"):
- cmd = "-catch-" + filterId
+ cmd = ["-catch-" + filterId]
else:
raise DAPException("Invalid exception filterID: " + str(filterId))
- result = exec_mi_and_log(cmd)
+ if "exception" in args and args["exception"] is not None:
+ cmd += ["-e", args["exception"]]
+ result = exec_mi_and_log(*cmd)
# While the Ada catchpoints emit a "bkptno" field here, the C++
# ones do not. So, instead we look at the "number" field.
num = result["bkpt"]["number"]
# Note that exception breakpoints do not support a hit count.
**args,
):
+ if filterId == "exception":
+ # Treat Ada exceptions specially -- in particular the
+ # condition is just an exception name, not an expression.
+ return {
+ "filterId": filterId,
+ "exception": condition,
+ }
return {
"filterId": filterId,
"condition": condition,
setExceptionBreakpoints \
{o filters [a [s nosuchfilter] [s assert]] \
filterOptions [a [o filterId [s exception] \
- condition [s "Global_Var = 23"]]]}]
+ condition [s program_error]]]}]
set bps [dict get [lindex $obj 0] body breakpoints]
# We should get three responses, because we requested three
"body reason" breakpoint \
"body hitBreakpointIds" 2
+set found_line -1
+set line [gdb_get_line_number "EXPECTED" $testdir/prog.adb]
+set bt [lindex [dap_check_request_and_response "backtrace" stackTrace \
+ {o threadId [i 1]}] \
+ 0]
+foreach frame [dict get $bt body stackFrames] {
+ if {[dict exists $frame source path]
+ && [file tail [dict get $frame source path]] == "prog.adb"} {
+ set found_line [dict get $frame line]
+ }
+}
+
+gdb_assert {$found_line == $line} "stopped at correct raise"
+
dap_check_request_and_response "continue to assert" continue \
{o threadId [i 1]}
dap_wait_for_event_and_check "stopped at assert" stopped \