struct tgdb *tgdb_initialize(const char *debugger, int argc, char **argv, int *debugger_fd, tgdb_callbacks callbacks) { /* Initialize the libtgdb context */ struct tgdb *tgdb = initialize_tgdb_context(callbacks); static struct annotations_parser_callbacks annotations_callbacks = { tgdb, tgdb_breakpoints_changed, tgdb_source_location_changed, tgdb_prompt_changed, tgdb_console_output, tgdb_command_error, tgdb_console_at_prompt }; tgdb->debugger_pid = invoke_debugger(debugger, argc, argv, &tgdb->debugger_stdin, &tgdb->debugger_stdout, 0); /* Couldn't invoke process */ if (tgdb->debugger_pid == -1) return NULL; tgdb->c = commands_initialize(tgdb); tgdb->parser = annotations_parser_initialize(annotations_callbacks); tgdb_open_new_tty(tgdb, &tgdb->inferior_stdin, &tgdb->inferior_stdout); /* Need to get source information before breakpoint information otherwise * the TGDB_UPDATE_BREAKPOINTS event will be ignored in process_commands() * because there are no source files to add the breakpoints to. */ tgdb_request_current_location(tgdb); /* gdb may already have some breakpoints when it starts. This could happen * if the user puts breakpoints in there .gdbinit. * This makes sure that TGDB asks for the breakpoints on start up. */ tgdb_issue_request(tgdb, TGDB_REQUEST_BREAKPOINTS, true); /** * Query if disassemble supports the /s flag */ tgdb_issue_request(tgdb, TGDB_REQUEST_DATA_DISASSEMBLE_MODE_QUERY, true); *debugger_fd = tgdb->debugger_stdout; return tgdb; }
static void tgdb_breakpoints_changed(void *context) { struct tgdb *tgdb = (struct tgdb*)context; tgdb_issue_request(tgdb, TGDB_REQUEST_BREAKPOINTS, true); }