Currently, the "stopped" event returned when a breakpoint is hit will always return only the ID of first breakpoint returned from `GetStopReasonDataAtIndex`. This is slightly different from the behaviour in `lldb`, where multiple breakpoints can exist at a single instruction address and all are returned as part of the stop reason when that address is hit. This patch allows all multiple hit breakpoints to be returned in the "stopped" event, both in the hitBreakpointIds field and in the description, using the same formatting as lldb e.g. "breakpoint 1.1 2.1". I'm not aware of any effect this will have on debugger plugins; as far as I can tell, it makes no difference within the VS Code UI - this just fixes a minor issue encountered while writing an `lldb-dap` backend for Dexter.
50 lines
1.1 KiB
C++
50 lines
1.1 KiB
C++
#include <dlfcn.h>
|
|
#include <stdexcept>
|
|
#include <stdio.h>
|
|
|
|
int twelve(int i) {
|
|
return 12 + i; // break 12
|
|
}
|
|
|
|
int thirteen(int i) {
|
|
return 13 + i; // break 13
|
|
}
|
|
|
|
namespace a {
|
|
int fourteen(int i) {
|
|
return 14 + i; // break 14
|
|
}
|
|
} // namespace a
|
|
int main(int argc, char const *argv[]) {
|
|
#if defined(__APPLE__)
|
|
const char *libother_name = "libother.dylib";
|
|
#else
|
|
const char *libother_name = "libother.so";
|
|
#endif
|
|
|
|
void *handle = dlopen(libother_name, RTLD_NOW);
|
|
if (handle == nullptr) {
|
|
fprintf(stderr, "%s\n", dlerror());
|
|
exit(1);
|
|
}
|
|
|
|
const char *message = "Hello from main!";
|
|
int (*foo)(int) = (int (*)(int))dlsym(handle, "foo");
|
|
if (foo == nullptr) {
|
|
fprintf(stderr, "%s\n", dlerror());
|
|
exit(2);
|
|
} // break non-breakpointable line
|
|
foo(12); // before loop
|
|
|
|
for (int i = 0; i < 10; ++i) {
|
|
int x = twelve(i) + thirteen(i) + a::fourteen(i); // break loop
|
|
}
|
|
printf("%s\n", message);
|
|
try {
|
|
throw std::invalid_argument("throwing exception for testing");
|
|
} catch (...) {
|
|
puts("caught exception...");
|
|
}
|
|
return 0; // after loop
|
|
}
|