100 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| set prompt \033[31m(gdb) \033[0m
 | |
| set disassembly-flavor intel
 | |
| 
 | |
| python
 | |
| import os
 | |
| gdb.execute('file ' + os.environ['BUILDROOT'] + 'sysroot/kernel')
 | |
| end
 | |
| 
 | |
| target remote :1234
 | |
| 
 | |
| set height 0
 | |
| set width 0
 | |
| 
 | |
| # The PANIC() macro - defined in src/kernel/include/debug.h - creates
 | |
| # a label of the form panic_breakpoint_xxx, where xxx is a number.
 | |
| # Unfortunately, gdb can set breakpoints on FUNCTIONS based on regex, but
 | |
| # not on LABELS.
 | |
| # The following piece of python code runs objdump to extract all panic_breakpoint
 | |
| # labels, and set breakpoints for each.
 | |
| python
 | |
| import subprocess
 | |
| import os
 | |
| dump = subprocess.Popen(("objdump", "-t", os.environ['BUILDROOT'] + "sysroot/kernel"), stdout=subprocess.PIPE)
 | |
| lines = subprocess.check_output(('grep', 'panic_breakpoint'), stdin=dump.stdout)
 | |
| dump.wait()
 | |
| for line in lines.split('\n'):
 | |
|   name = line.split(' ')[-1]
 | |
|   if name:
 | |
|     gdb.execute('b ' + name, to_string=True)
 | |
| end
 | |
| 
 | |
| define q
 | |
| monitor quit
 | |
| end
 | |
| 
 | |
| define reset
 | |
| monitor system_reset
 | |
| end
 | |
| 
 | |
| define mmap
 | |
| monitor info mem
 | |
| end
 | |
| 
 | |
| python
 | |
| 
 | |
| import re
 | |
| 
 | |
| class Reg(gdb.Command):
 | |
| 
 | |
|   def __init__(self):
 | |
|     super(Reg, self).__init__("reg", gdb.COMMAND_USER)
 | |
| 
 | |
|   def invoke(self, arg, from_tty):
 | |
|     regs = gdb.execute('monitor info registers', False, True)
 | |
| 
 | |
|     if not arg:
 | |
|     # If no argument was given, print the output from qemu
 | |
|       print regs
 | |
|       return
 | |
| 
 | |
|     if arg.upper() in ['CS', 'DS', 'ES', 'FS', 'GS', 'SS', 'LDT', 'TR']:
 | |
|     # Code selectors may contain equals signs
 | |
|       for l in regs.splitlines():
 | |
|         if l.startswith(arg.upper()):
 | |
|           print l
 | |
|     elif arg.upper() in ['EFL', 'RFL']:
 | |
|     # The xFLAGS registers contains equals signs
 | |
|       for l in regs.splitlines():
 | |
|         if arg.upper() in l:
 | |
|           print ' '.join(l.split()[1:])
 | |
|           # The xFLAGS register is the second one on the line
 | |
|     else:
 | |
|     # Split at any word followed by and equals sign
 | |
|     # Clean up both sides of the split and put into a dictionary
 | |
|     # then print the requested register value
 | |
|       regex = re.compile("[A-Z0-9]+\s?=")
 | |
|       names = [v[:-1].strip() for v in regex.findall(regs)]
 | |
|       values = [v.strip() for v in regex.split(regs)][1:]
 | |
|       regs = dict(zip(names, values))
 | |
|       print "%s=%s" % (arg.upper(), regs[arg.upper()])
 | |
| 
 | |
| 
 | |
| Reg()
 | |
| 
 | |
| end
 | |
| 
 | |
| define restore_env
 | |
| set $name = $arg0
 | |
| python
 | |
| 
 | |
| registers = {r: gdb.parse_and_eval('$name->' + r) for r in
 | |
| ['rax', 'rbx', 'rcx', 'rdx', 'rsi', 'rdi', 'rbp', 'rsp', 'r8', 'r9', 'r10',
 | |
| 'r11', 'r12', 'r13', 'r14', 'r15', 'rip']}
 | |
| 
 | |
| for r in registers.items():
 | |
|   gdb.parse_and_eval('$%s=%s' % r)
 | |
| gdb.execute('frame 0')
 | |
| end
 | |
| end
 |