/*********************************************************************** * should_stop * * Check whether or not the condition (bp / skipcount) of a break/watch * point are met. */ static BOOL should_stop(int bpnum) { struct dbg_breakpoint* bp = &dbg_curr_process->bp[bpnum]; if (bp->condition != NULL) { struct dbg_lvalue lvalue = expr_eval(bp->condition); if (lvalue.type.id == dbg_itype_none) { /* * Something wrong - unable to evaluate this expression. */ dbg_printf("Unable to evaluate expression "); expr_print(bp->condition); dbg_printf("\nTurning off condition\n"); break_add_condition(bpnum, NULL); } else if (!types_extract_as_integer(&lvalue)) { return FALSE; } } if (bp->skipcount > 0) bp->skipcount--; return bp->skipcount == 0; }
/*********************************************************************** * print_basic * * Implementation of the 'print' command. */ void print_basic(const struct dbg_lvalue* lvalue, int count, char format) { long int res; if (lvalue->type.id == dbg_itype_none) { dbg_printf("Unable to evaluate expression\n"); return; } res = types_extract_as_integer(lvalue); /* FIXME: this implies i386 byte ordering */ switch (format) { case 'x': if (lvalue->addr.Mode == AddrMode1616 || lvalue->addr.Mode == AddrModeReal) dbg_printf("0x%04lx", res); else dbg_printf("0x%08lx", res); break; case 'd': dbg_printf("%ld\n", res); break; case 'c': dbg_printf("%d = '%c'", (char)(res & 0xff), (char)(res & 0xff)); break; case 'u': { WCHAR wch = (WCHAR)(res & 0xFFFF); dbg_printf("%d = '", wch); dbg_outputW(&wch, 1); dbg_printf("'"); } break; case 'i': case 's': case 'w': case 'b': dbg_printf("Format specifier '%c' is meaningless in 'print' command\n", format); case 0: if (lvalue->type.id == dbg_itype_segptr) dbg_printf("%ld", res); else print_typed_basic(lvalue); break; } }
/****************************************************************** * types_extract_as_address * * */ void types_extract_as_address(const struct dbg_lvalue* lvalue, ADDRESS64* addr) { if (lvalue->type.id == dbg_itype_segptr && lvalue->type.module == 0) { *addr = lvalue->addr; } else { addr->Mode = AddrModeFlat; addr->Offset = types_extract_as_integer( lvalue ); } }
/*********************************************************************** * break_is_logging_breakpoint * * Determine if current breakpoint is a logging breakpoint whose condition is "-1" . */ BOOL break_is_logging_breakpoint(ADDRESS64* addr) { if (dbg_curr_thread->stopped_xpoint > 0) { struct dbg_breakpoint* bp = &dbg_curr_process->bp[dbg_curr_thread->stopped_xpoint]; if (bp->condition != NULL) { struct dbg_lvalue lvalue = expr_eval(bp->condition); if (lvalue.type.id == dbg_itype_none) { return 0; } return -1 == types_extract_as_integer(&lvalue); } } return 0; }
void memory_disassemble(const struct dbg_lvalue* xstart, const struct dbg_lvalue* xend, int instruction_count) { static ADDRESS64 last = {0,0,0}; int stop = 0; int i; if (!xstart && !xend) { if (!last.Segment && !last.Offset) memory_get_current_pc(&last); } else { if (xstart) types_extract_as_address(xstart, &last); if (xend) stop = types_extract_as_integer(xend); } for (i = 0; (instruction_count == 0 || i < instruction_count) && (stop == 0 || last.Offset <= stop); i++) memory_disasm_one_insn(&last); }