static BOOL CALLBACK mcb(PCWSTR module, DWORD64 base, void* user) { struct cb_break_lineno* bkln = user; SymEnumLines(dbg_curr_process->handle, base, NULL, bkln->filename, line_cb, bkln); /* continue module enum if no addr found * FIXME: we don't report when several addresses match the same filename/lineno pair */ return !bkln->addr.Offset; }
const bool Symbols::DumpSourceFileInfo(const DWORD64 dwBaseAddress, const char * const pFilePath) { const bool bSuccess = BOOLIFY(SymEnumLines(m_hProcess, dwBaseAddress, nullptr, pFilePath, SymEnumLinesCallback, nullptr)); if (!bSuccess) { fprintf(stderr, "Could not dump source file %s with base address %p.\n", pFilePath, dwBaseAddress); } return bSuccess; }
/*********************************************************************** * break_add_break_from_lineno * * Add a breakpoint from a line number in current file */ void break_add_break_from_lineno(const char *filename, int lineno, BOOL swbp) { struct cb_break_lineno bkln; bkln.addr.Offset = 0; bkln.lineno = lineno; if (!filename) { DWORD disp; ADDRESS64 curr; IMAGEHLP_LINE64 il; DWORD_PTR linear; memory_get_current_pc(&curr); linear = (DWORD_PTR)memory_to_linear_addr(&curr); il.SizeOfStruct = sizeof(il); if (!SymGetLineFromAddr64(dbg_curr_process->handle, linear, &disp, &il)) { dbg_printf("Unable to add breakpoint (unknown address %lx)\n", linear); return; } filename = il.FileName; SymEnumLines(dbg_curr_process->handle, linear, NULL, filename, line_cb, &bkln); } else { /* we have to enumerate across modules */ bkln.filename = filename; SymEnumerateModulesW64(dbg_curr_process->handle, mcb, &bkln); } if (bkln.addr.Offset) break_add_break(&bkln.addr, TRUE, swbp); else dbg_printf("Unknown line number\n" "(either out of file, or no code at given line number)\n"); }