From f944d66c9314b22f84a3bdd39d70f2790fb727d8 Mon Sep 17 00:00:00 2001 From: ridethepig Date: Tue, 7 Mar 2023 15:35:50 +0800 Subject: [PATCH] MileStone 7, All required parts done --- proj-1/deet/src/debugger.rs | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/proj-1/deet/src/debugger.rs b/proj-1/deet/src/debugger.rs index bc29d99..4e979c3 100644 --- a/proj-1/deet/src/debugger.rs +++ b/proj-1/deet/src/debugger.rs @@ -34,6 +34,10 @@ fn parse_address(addr: &str) -> Option { usize::from_str_radix(addr_without_0x, 16).ok() } +fn parse_lineno(lineno: &str) -> Option { + usize::from_str_radix(lineno, 10).ok() +} + impl Debugger { /// Initializes the debugger. pub fn new(target: &str) -> Debugger { @@ -48,7 +52,7 @@ impl Debugger { std::process::exit(1); } }; - debug_data.print(); + // debug_data.print(); let history_path = format!("{}/.deet_history", std::env::var("HOME").unwrap()); let mut readline = Editor::<()>::new(); @@ -118,7 +122,8 @@ impl Debugger { .inferior .as_mut() .unwrap() - .write_byte(target_addr, orig_byte).unwrap(); + .write_byte(target_addr, orig_byte) + .unwrap(); assert_eq!(break_0xcc, 0xcc); self.inferior .as_mut() @@ -235,6 +240,33 @@ impl Debugger { } else { eprintln!("Unable to parse breakpoint \"{}\"", arg_string); } + } else if let Some(line_no) = parse_lineno(arg_str) { + if let Some(addr) = self.debug_data.get_addr_for_line(None, line_no) { + println!( + "Set breakpoint {} at {}({:#x})", + self.breakpoint_vec.len(), + arg_string, + addr + ); + self.breakpoint_vec.push(addr); + self._install_breakpoint(addr); + } else { + eprintln!("Unable to parse breakpoint \"{}\"", arg_string); + } + } else { + if let Some(addr) = self.debug_data.get_addr_for_function(None, &arg_string) + { + println!( + "Set breakpoint {} at {}({:#x})", + self.breakpoint_vec.len(), + arg_string, + addr + ); + self.breakpoint_vec.push(addr); + self._install_breakpoint(addr); + } else { + eprintln!("Unable to parse breakpoint \"{}\"", arg_string); + } } } }