1 2// LLDB C++ API Test: verify that the function registered with 3// SBBreakpoint.SetCallback() is invoked when a breakpoint is hit. 4 5#include <mutex> 6#include <iostream> 7#include <vector> 8#include <string> 9 10%include_SB_APIs% 11 12#include "common.h" 13 14using namespace std; 15using namespace lldb; 16 17mutex g_mutex; 18condition_variable g_condition; 19int g_breakpoint_hit_count = 0; 20 21bool BPCallback (void *baton, 22 SBProcess &process, 23 SBThread &thread, 24 SBBreakpointLocation &location) { 25 lock_guard<mutex> lock(g_mutex); 26 g_breakpoint_hit_count += 1; 27 g_condition.notify_all(); 28 return true; 29} 30 31void test(SBDebugger &dbg, vector<string> args) { 32 dbg.SetAsync(false); 33 SBTarget target = dbg.CreateTarget(args.at(0).c_str()); 34 if (!target.IsValid()) throw Exception("invalid target"); 35 36 SBBreakpoint breakpoint = target.BreakpointCreateByName("next"); 37 if (!breakpoint.IsValid()) throw Exception("invalid breakpoint"); 38 39 if(breakpoint.GetNumLocations() != 1) throw Exception("unexpected amount of breakpoint locations"); 40 SBBreakpointLocation breakpoint_location = breakpoint.GetLocationAtIndex(0); 41 breakpoint_location.SetCallback(BPCallback, 0); 42 43 std::unique_ptr<char> working_dir(get_working_dir()); 44 SBProcess process = target.LaunchSimple (0, 0, working_dir.get()); 45 46 { 47 unique_lock<mutex> lock(g_mutex); 48 g_condition.wait_for(lock, chrono::seconds(5)); 49 if (g_breakpoint_hit_count != 1) 50 throw Exception("Breakpoint hit count expected to be 1"); 51 } 52} 53