├── Doxyfile ├── GDB-PYTHON-HELP ├── README ├── examples ├── function-sniffers │ ├── read-sniffer.py │ ├── readline-sniffer.py │ └── write-sniffer.py └── in-memory-fuzzer │ ├── Makefile │ ├── getdomain.c │ ├── in-memory-break.py │ └── in-memory-fuzz.py ├── gdb_utils.py ├── html ├── bc_s.png ├── closed.png ├── doxygen.css ├── doxygen.png ├── files.html ├── gdb__utils_8py.html ├── index.html ├── installdox ├── namespacegdb__utils.html ├── namespacemembers.html ├── namespacemembers_func.html ├── namespaces.html ├── nav_f.png ├── nav_h.png ├── open.png ├── search │ ├── all_61.html │ ├── all_64.html │ ├── all_65.html │ ├── all_67.html │ ├── all_6e.html │ ├── all_70.html │ ├── all_72.html │ ├── all_73.html │ ├── close.png │ ├── files_67.html │ ├── functions_61.html │ ├── functions_64.html │ ├── functions_65.html │ ├── functions_67.html │ ├── functions_6e.html │ ├── functions_70.html │ ├── functions_72.html │ ├── functions_73.html │ ├── mag_sel.png │ ├── namespaces_67.html │ ├── nomatches.html │ ├── search.css │ ├── search.js │ ├── search_l.png │ ├── search_m.png │ └── search_r.png ├── tab_a.png ├── tab_b.png ├── tab_h.png ├── tab_s.png └── tabs.css ├── images ├── in-mem-loop.png └── in-mem-snap.png └── latex ├── Makefile ├── doxygen.sty ├── files.tex ├── gdb__utils_8py.tex ├── namespacegdb__utils.tex ├── namespaces.tex ├── refman.aux ├── refman.idx ├── refman.ilg ├── refman.ind ├── refman.log ├── refman.out ├── refman.pdf ├── refman.tex └── refman.toc /Doxyfile: -------------------------------------------------------------------------------- 1 | INPUT = gdb_utils.py 2 | IMAGE_PATH = images 3 | EXTRACT_STATIC = YES 4 | EXTRACT_ALL = YES 5 | 6 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | This README file is a condensed version of the project wiki: 2 | https://github.com/crossbowerbt/GDB-Python-Utils/wiki 3 | 4 | == Project description == 5 | 6 | This project aims to create and maintain an utility library to provide useful functions to the standard GDB Python library, that is still under construction, and, for this reason, lacks very important features... 7 | 8 | The library is simple to use (just copy the standalone gdb_utils.py file in your project), but helps the creation of powerful python scripts that can exploit most of the GDB features. 9 | 10 | Some features already implemented: 11 | * Execute a GDB command and obtain its output 12 | * Search functions and processes with or without regular expressions 13 | * Disassemble memory regions and obtain a structured output 14 | * Assemble x86/x64 instructions and obtain the resulting payload 15 | 16 | == But, hey, GDB and python?!? == 17 | 18 | Yeah! Since version 7.0, GDB can be scripted in python. 19 | 20 | Even if development is not finished yet, you can already do amazing things, as I will try to show you with the examples included in the library. 21 | 22 | If you don't believe me, check these references: 23 | * the project page: http://sourceware.org/gdb/wiki/PythonGdb 24 | * the excellent tutorials of Tom Tromey: http://tromey.com/blog/?cat=17 25 | * GDB python documentation: http://sourceware.org/gdb/onlinedocs/gdb/Python.html 26 | 27 | To install a Python-enabled GDB you can read the first tutorial of Tom Tromey: http://tromey.com/blog/?p=494. Maybe, in future, distributions will have a package for it... 28 | 29 | == Documentation == 30 | 31 | Since it's difficult to get in the mind of the developer, this project adopts the rule "a function - an example". 32 | 33 | This means that for every function or class exposed by the library, there will be a nice snippet of code that explains how to use it: lovers of copy/paste will quickly feel at ease, although we recommend to understand what a piece of code does before using it... 34 | 35 | The "formal" documentation is created with Doxygen and available under html or latex directory in html or pdf formats. 36 | 37 | The "snippet" documentation is available at https://github.com/crossbowerbt/GDB-Python-Utils/wiki/Snippets/, in the project wiki. 38 | -------------------------------------------------------------------------------- /examples/function-sniffers/read-sniffer.py: -------------------------------------------------------------------------------- 1 | #!/usr/local/bin/gdb -P 2 | # 3 | # This script is a sniffer for the read() library function. 4 | # It can attach to a process and sniff its read() calls... 5 | # 6 | # Usage: 7 | # ./read-sniffer 8 | # 9 | 10 | import gdb 11 | 12 | # import gdb_utils from the current directory 13 | sys.path.append(os.getcwd()) 14 | import gdb_utils 15 | 16 | # 17 | # Script usage 18 | # 19 | def usage(): 20 | print "Usage:" 21 | print "\t./read-sniffer " 22 | gdb.execute('quit') 23 | 24 | # 25 | # Breakpoint class that sniff the read() function 26 | # 27 | class ReadSnifferBreakpoint (gdb.Breakpoint): 28 | 29 | # 30 | # Initialize the breakpoint 31 | # 32 | def __init__ (self): 33 | 34 | # search the end of the function 35 | ret_insts = gdb_utils.disassemble_function('read', 'ret') 36 | 37 | # just use the address of first ret instruction 38 | ret_addr = ret_insts.keys()[0] 39 | 40 | super (ReadSnifferBreakpoint, self).__init__ ('*' + str(ret_addr)) 41 | 42 | # 43 | # Called when the breakpoint is hit 44 | # 45 | def stop (self): 46 | 47 | # get the string length, from the return value of the function 48 | length = gdb.parse_and_eval('$rax') 49 | 50 | # get the string address, from the second arguments of the function 51 | address = gdb.parse_and_eval('$rsi') 52 | 53 | # get the string 54 | string = gdb.inferiors()[0].read_memory(address, length) 55 | 56 | # print sniffed data 57 | print string 58 | 59 | # return False to continue the execution of the program 60 | return False 61 | 62 | 63 | # 64 | # The execution starts here 65 | # 66 | 67 | # fix a little gdb bug (or feature? I don't know...) 68 | sys.argv = gdb_utils.normalized_argv() 69 | 70 | # check and get arguments 71 | if len(sys.argv) < 1: 72 | usage() 73 | 74 | process_name = sys.argv[0] 75 | 76 | # get a list of processes that match the given process name 77 | processes = gdb_utils.search_processes(process_name) 78 | 79 | # print list and ask for the pid 80 | print 'Processes that match:' 81 | for proc in processes: 82 | print str(proc['pid']) + ' ' + proc['command'] 83 | 84 | print '' 85 | print 'Enter the process pid (or just press enter to exit):' 86 | selection = sys.stdin.readline().strip('\r\n ') 87 | 88 | if selection == '': 89 | gdb.execute('quit') 90 | 91 | # attach to the selected process 92 | gdb.execute('attach ' + selection) 93 | 94 | # generate sniffer breakpoint 95 | ReadSnifferBreakpoint() 96 | 97 | # run and sniff... 98 | gdb.execute('continue') 99 | 100 | gdb.execute('detach') 101 | gdb.execute('quit') 102 | 103 | -------------------------------------------------------------------------------- /examples/function-sniffers/readline-sniffer.py: -------------------------------------------------------------------------------- 1 | #!/usr/local/bin/gdb -P 2 | # 3 | # This script is a sniffer for the readline() library function. 4 | # It can attach to a process and sniff its readline() calls... 5 | # 6 | # This script is especially suitable to sniff the commands typed 7 | # in a shell that uses readline(), such as bash. It's just an hint ;) 8 | # 9 | # Usage: 10 | # ./readline-sniffer 11 | # 12 | 13 | import gdb 14 | 15 | # import gdb_utils from the current directory 16 | sys.path.append(os.getcwd()) 17 | import gdb_utils 18 | 19 | # 20 | # Script usage 21 | # 22 | def usage(): 23 | print "Usage:" 24 | print "\t./readline-sniffer " 25 | gdb.execute('quit') 26 | 27 | # 28 | # Breakpoint class that sniff the readline() function 29 | # 30 | class ReadlineSnifferBreakpoint (gdb.Breakpoint): 31 | 32 | # 33 | # Initialize the breakpoint 34 | # 35 | def __init__ (self): 36 | 37 | # search the end of the function 38 | ret_insts = gdb_utils.disassemble_function('readline', 'ret') 39 | 40 | # just use the address of first ret instruction 41 | ret_addr = ret_insts.keys()[0] 42 | 43 | super (ReadlineSnifferBreakpoint, self).__init__ ('*' + str(ret_addr)) 44 | 45 | # 46 | # Called when the breakpoint is hit 47 | # 48 | def stop (self): 49 | 50 | # get the string address, from the return value 51 | address = gdb.parse_and_eval('$rax') 52 | 53 | # get the string, using gdb_utils.read_string(), since it's null terminated... 54 | string = gdb_utils.read_string(address, 1024) 55 | 56 | # print sniffed data 57 | print string 58 | 59 | # return False to continue the execution of the program 60 | return False 61 | 62 | 63 | # 64 | # The execution starts here 65 | # 66 | 67 | # fix a little gdb bug (or feature? I don't know...) 68 | sys.argv = gdb_utils.normalized_argv() 69 | 70 | # check and get arguments 71 | if len(sys.argv) < 1: 72 | usage() 73 | 74 | process_name = sys.argv[0] 75 | 76 | # get a list of processes that match the given process name 77 | processes = gdb_utils.search_processes(process_name) 78 | 79 | # print list and ask for the pid 80 | print 'Processes that match:' 81 | for proc in processes: 82 | print str(proc['pid']) + ' ' + proc['command'] 83 | 84 | print '' 85 | print 'Enter the process pid (or just press enter to exit):' 86 | selection = sys.stdin.readline().strip('\r\n ') 87 | 88 | if selection == '': 89 | gdb.execute('quit') 90 | 91 | # attach to the selected process 92 | gdb.execute('attach ' + selection) 93 | 94 | # generate sniffer breakpoint 95 | ReadlineSnifferBreakpoint() 96 | 97 | # run and sniff... 98 | gdb.execute('continue') 99 | 100 | gdb.execute('detach') 101 | gdb.execute('quit') 102 | 103 | -------------------------------------------------------------------------------- /examples/function-sniffers/write-sniffer.py: -------------------------------------------------------------------------------- 1 | #!/usr/local/bin/gdb -P 2 | # 3 | # This script is a sniffer for the write() library function. 4 | # It can attach to a process and sniff its write() calls... 5 | # 6 | # Usage: 7 | # ./write-sniffer 8 | # 9 | 10 | import gdb 11 | 12 | # import gdb_utils from the current directory 13 | sys.path.append(os.getcwd()) 14 | import gdb_utils 15 | 16 | # 17 | # Script usage 18 | # 19 | def usage(): 20 | print "Usage:" 21 | print "\t./write-sniffer " 22 | gdb.execute('quit') 23 | 24 | # 25 | # Breakpoint class that sniff the write() function 26 | # 27 | class WriteSnifferBreakpoint (gdb.Breakpoint): 28 | 29 | # 30 | # Initialize the breakpoint 31 | # 32 | def __init__ (self): 33 | super (WriteSnifferBreakpoint, self).__init__ ('write') 34 | 35 | # 36 | # Called when the breakpoint is hit 37 | # 38 | def stop (self): 39 | 40 | # get the string length, from the return value of the function 41 | length = gdb.parse_and_eval('$rax') 42 | 43 | # get the string address, from the second arguments of the function 44 | address = gdb.parse_and_eval('$rsi') 45 | 46 | # get the string 47 | string = gdb.inferiors()[0].read_memory(address, length) 48 | 49 | # print sniffed data 50 | print string 51 | 52 | # return False to continue the execution of the program 53 | return False 54 | 55 | 56 | # 57 | # The execution starts here 58 | # 59 | 60 | # fix a little gdb bug (or feature? I don't know...) 61 | sys.argv = gdb_utils.normalized_argv() 62 | 63 | # check and get arguments 64 | if len(sys.argv) < 1: 65 | usage() 66 | 67 | process_name = sys.argv[0] 68 | 69 | # get a list of processes that match the given process name 70 | processes = gdb_utils.search_processes(process_name) 71 | 72 | # print list and ask for the pid 73 | print 'Processes that match:' 74 | for proc in processes: 75 | print str(proc['pid']) + ' ' + proc['command'] 76 | 77 | print '' 78 | print 'Enter the process pid (or just press enter to exit):' 79 | selection = sys.stdin.readline().strip('\r\n ') 80 | 81 | if selection == '': 82 | gdb.execute('quit') 83 | 84 | # attach to the selected process 85 | gdb.execute('attach ' + selection) 86 | 87 | # generate sniffer breakpoint 88 | WriteSnifferBreakpoint() 89 | 90 | # run and sniff... 91 | gdb.execute('continue') 92 | 93 | gdb.execute('detach') 94 | gdb.execute('quit') 95 | 96 | -------------------------------------------------------------------------------- /examples/in-memory-fuzzer/Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | gcc -o getdomain getdomain.c 3 | 4 | -------------------------------------------------------------------------------- /examples/in-memory-fuzzer/getdomain.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | void print_domain(char *domain) { 5 | printf("Domain is %s\n", domain); 6 | } 7 | 8 | char *parse(char *str) { 9 | char buffer[1024]; 10 | char *token, *substr; 11 | 12 | if(!str) { 13 | return; 14 | } 15 | 16 | for (substr=str; ; substr=NULL) { 17 | token = strtok(substr, "@"); 18 | 19 | if (token==NULL) { 20 | break; 21 | } 22 | 23 | if (substr==NULL) { 24 | strcpy(buffer, token); 25 | print_domain(buffer); 26 | return "YES"; 27 | } 28 | } 29 | 30 | return "NO"; 31 | } 32 | 33 | int main(int argc, char **argv) { 34 | 35 | if (argc<2) { 36 | puts("./getdomain "); 37 | return 1; 38 | } 39 | 40 | printf("Domain is valid? %s\n", parse(strdup(argv[1]))); 41 | 42 | return 0; 43 | } 44 | -------------------------------------------------------------------------------- /examples/in-memory-fuzzer/in-memory-break.py: -------------------------------------------------------------------------------- 1 | #!/usr/local/bin/gdb -P 2 | # 3 | # Utility able to track the functions' parameters of a program 4 | # to individuate possible in-memory-fuzzable points 5 | # 6 | # Usage: 7 | # ./in-memory-break 8 | # 9 | 10 | import subprocess 11 | import re 12 | import sys 13 | import os 14 | import gdb 15 | 16 | # import gdb_utils from the current directory 17 | sys.path.append(os.getcwd()) 18 | import gdb_utils 19 | 20 | # 21 | # Script usage 22 | # 23 | def usage(): 24 | print "Usage:" 25 | print "\t./in-memory-break.py " 26 | gdb.execute('quit') 27 | 28 | # 29 | # Breakpoint class that prints function arguments 30 | # 31 | class FunctionArgsBreakpoint (gdb.Breakpoint): 32 | 33 | # 34 | # Initialize the breakpoint 35 | # 36 | def __init__ (self, location, name): 37 | 38 | # save address and function name 39 | self.locstr = location 40 | self.locname = name 41 | 42 | # clear invalid (relative) names 43 | if "+0x" in self.locname or "-0x" in self.locname: 44 | self.locname = "???" 45 | 46 | # exclude library functions 47 | #if "@plt>" in self.locname: 48 | # return 49 | 50 | super (FunctionArgsBreakpoint, self).__init__ (location) 51 | 52 | # 53 | # Called when the breakpoint is hit 54 | # 55 | def stop (self): 56 | 57 | print "Function",self.locname,"at",self.locstr+":" 58 | 59 | # read function arguments (linux amd64 calling convention) 60 | args = list() 61 | args.append(gdb.parse_and_eval("$rdi")) 62 | args.append(gdb.parse_and_eval("$rsi")) 63 | args.append(gdb.parse_and_eval("$rdx")) 64 | args.append(gdb.parse_and_eval("$rcx")) 65 | args.append(gdb.parse_and_eval("$r8")) 66 | args.append(gdb.parse_and_eval("$r9")) 67 | 68 | # print arguments 69 | arg_num = 0 70 | for arg in args: 71 | 72 | buffer = gdb_utils.read_string(arg, 32) 73 | 74 | if buffer: 75 | print "\targument"+str(arg_num),"=",arg,'"'+buffer+'"' 76 | else: 77 | print "\targument"+str(arg_num),"=",arg 78 | 79 | arg_num += 1 80 | 81 | print "" 82 | 83 | # return False to continue the execution of the program 84 | return False 85 | 86 | # 87 | # Function that dinamically generates breakpoints (using objdump) 88 | # 89 | def generate_breakpoints (program_name): 90 | 91 | # get program disassembly via objdump 92 | insts = gdb_utils.execute_external_output('objdump -d ' + program_name) 93 | 94 | # find calls 95 | functions = list() 96 | for inst in insts: 97 | 98 | # the method is simple: 99 | # we search for callq instructions and read their destination 100 | if re.search("callq\s+40.+", inst): 101 | 102 | # we need only the function address and the function name 103 | func = inst.split(" ")[-2] + " " + inst.split(" ")[-1] 104 | functions.append(func) 105 | 106 | # delete duplicates and sort breakpoints 107 | functions = list(set(functions)) 108 | functions.sort() 109 | 110 | # create breakpoints 111 | for func in functions: 112 | func = func.split(" ") 113 | FunctionArgsBreakpoint("*0x"+func[0], func[1]) 114 | 115 | 116 | # 117 | # The execution starts here 118 | # 119 | 120 | # fix a little gdb bug (or feature? I don't know...) 121 | sys.argv = gdb_utils.normalized_argv() 122 | 123 | # check and get arguments 124 | if len(sys.argv) < 1: 125 | usage() 126 | 127 | program_name = sys.argv[0] 128 | arguments = sys.argv[1:] 129 | 130 | # load executable program 131 | gdb.execute('file ' + program_name) 132 | 133 | # initialize 134 | generate_breakpoints(program_name) 135 | 136 | print "" 137 | 138 | # run with arguments 139 | gdb.execute('r ' + ' '.join(arguments)) 140 | 141 | gdb.execute('quit') 142 | 143 | -------------------------------------------------------------------------------- /examples/in-memory-fuzzer/in-memory-fuzz.py: -------------------------------------------------------------------------------- 1 | #!/usr/local/bin/gdb -P 2 | # 3 | # Proof-of-concept implementation of an in-memory-fuzzer 4 | # to individuate bugs in parsing routines 5 | # 6 | # The fuzzer uses process snapshots/restorations, and can be used as a base 7 | # to implement more complex fuzzers... 8 | # 9 | # Usage: 10 | # ./in-memory-fuzz 11 | # 12 | import gdb 13 | 14 | # import gdb_utils from the current directory 15 | sys.path.append(os.getcwd()) 16 | import gdb_utils 17 | 18 | # 19 | # Script usage 20 | # 21 | def usage(): 22 | print "Usage:" 23 | print "\t./in-memory-fuzz.py " 24 | print "Examples:" 25 | print "\t./in-memory-fuzz.py parse getdomain test@email.com" 26 | print "\t./in-memory-fuzz.py *0x40064d getdomain test@email.com" 27 | gdb.execute('quit') 28 | 29 | # 30 | # Allocate memory on debugged process heap 31 | # 32 | def malloc(size): 33 | output = gdb_utils.execute_output('call malloc(' + str(size) + ')') 34 | # return memory address 35 | return int(output[0].split(' ')[2]) 36 | 37 | # 38 | # Generate strings for the fuzzer 39 | # 40 | # In this case we start with a short email and slowly increase its length... 41 | # 42 | fuzz_email = '' 43 | def get_fuzz_email(): 44 | global fuzz_email 45 | 46 | if fuzz_email == '': 47 | fuzz_email = 'test@email.com' # start case 48 | else: 49 | fuzz_email += 'A' # append an 'A' to the email 50 | 51 | return fuzz_email 52 | 53 | # 54 | # The execution starts here 55 | # 56 | 57 | # fix a little gdb bug (or feature? I don't know...) 58 | sys.argv = gdb_utils.normalized_argv() 59 | 60 | # check and get arguments 61 | if len(sys.argv) < 2: 62 | usage() 63 | 64 | brk_function = sys.argv[0] 65 | program_name = sys.argv[1] 66 | arguments = sys.argv[2:] 67 | 68 | # load executable program 69 | gdb.execute('file ' + program_name) 70 | 71 | # set shapshot breakpoint 72 | gdb.execute('break ' + brk_function) 73 | 74 | # run with arguments 75 | gdb.execute('r ' + ' '.join(arguments)) 76 | 77 | # 78 | # The execution has now reached the breakpoint 79 | # 80 | 81 | # fuzzing loop (with snapshot/restore) 82 | i = 1 83 | while True: 84 | print 'fuzz loop: ' + str(i) 85 | i +=1 86 | 87 | # we take the snapshot with the command 'checkpoint' (GDB >= 7.0) 88 | gdb.execute('checkpoint') 89 | 90 | # get the current fuzz string (and null terminate it) 91 | fuzz_string = get_fuzz_email() + '\0' 92 | 93 | # if the fuzz string is too long, we end the loop 94 | if len(fuzz_string) > 65000: 95 | break 96 | 97 | # allocate the space for the fuzz string on the heap 98 | fuzz_string_addr = malloc( len(fuzz_string) + 10 ) 99 | 100 | # set the register that holds the first argument (amd64 arch) to the address of fuzz_string 101 | gdb.execute('set $rdi=' + str(fuzz_string_addr)) 102 | 103 | # write fuzz_string to that address 104 | inferior = gdb.inferiors()[0] 105 | inferior.write_memory(fuzz_string_addr, fuzz_string, len(fuzz_string)) 106 | 107 | print 'string len: ' + str(len(fuzz_string)) 108 | gdb.execute("x/s $rdi") 109 | 110 | # continue execution until the end of the function 111 | gdb.execute('finish') 112 | 113 | # check if the program has crashed 114 | if gdb_utils.execute_output('info checkpoints')[0] == 'No checkpoints.': 115 | print '' 116 | print '#' 117 | print '# The program has crashed! Stack exhaustion or bug???' 118 | print '# Now is your turn, have fun! :P' 119 | print '#' 120 | print '' 121 | gdb.execute('quit') 122 | 123 | # restore snapshot 124 | gdb.execute("restart 1") 125 | gdb.execute("delete checkpoint 0") 126 | 127 | # script ends 128 | print 'No crashes...' 129 | gdb.execute('quit') 130 | 131 | -------------------------------------------------------------------------------- /gdb_utils.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | import re 3 | import sys 4 | import os 5 | import gdb 6 | 7 | ## 8 | # @package gdb_utils 9 | # Various utility functions to work with GDB. 10 | # 11 | # This package provides functions not included in the default gdb module. 12 | # 13 | 14 | ## 15 | # Read an ASCII string from memory 16 | # 17 | # @param address (int) memory address of the string 18 | # @param count (int) maximum string length 19 | # 20 | # @return string read (str) 21 | # 22 | def read_string(address, count): 23 | 24 | try: 25 | # try to read the string pointed by address 26 | buffer = gdb.inferiors()[0].read_memory(address, count) 27 | 28 | # determine string length 29 | i = 0 30 | while ord(buffer[i]) > 0 and ord(buffer[i]) < 128: 31 | i += 1 32 | 33 | # terminate and escape buffer 34 | buffer = buffer[0:i] 35 | buffer = buffer.replace("\n","\\n").replace("\r","\\r").replace("\t","\\t").replace("\"","\\\"") 36 | 37 | # return buffer 38 | return buffer 39 | 40 | except: 41 | # cannot read the string 42 | return None 43 | 44 | ## 45 | # Execute a GDB command with output capture 46 | # 47 | # @param command (str) GDB command 48 | # 49 | # @return command output (str) 50 | # 51 | def execute_output(command): 52 | 53 | # create temporary file for the output 54 | filename = os.getenv('HOME') + os.sep + 'gdb_output_' + str(os.getpid()) 55 | 56 | # set gdb logging 57 | gdb.execute("set logging file " + filename) 58 | gdb.execute("set logging overwrite on") 59 | gdb.execute("set logging redirect on") 60 | gdb.execute("set logging on") 61 | 62 | # execute command 63 | try: 64 | gdb.execute(command) 65 | except: 66 | pass 67 | 68 | # restore normal gdb behaviour 69 | gdb.execute("set logging off") 70 | gdb.execute("set logging redirect off") 71 | 72 | # read output and close temporary file 73 | outfile = open(filename, 'r') 74 | output = outfile.read() 75 | outfile.close() 76 | 77 | # delete file 78 | os.remove(filename) 79 | 80 | # split lines 81 | output = output.splitlines() 82 | 83 | return output 84 | 85 | ## 86 | # Execute external command 87 | # 88 | # @param command (str) command string to execute (command + arguments) 89 | # 90 | def execute_external(command): 91 | 92 | # execute command 93 | subprocess.call(command, shell=True) 94 | 95 | ## 96 | # Execute external command with output capture 97 | # 98 | # @param command (str) command string to execute (command + arguments) 99 | # 100 | # @return command output as list of strings 101 | # 102 | def execute_external_output(command): 103 | 104 | # execute command and capture output 105 | ps = subprocess.Popen([command], stdout=subprocess.PIPE, shell=True) 106 | (out, err) = ps.communicate() 107 | output = out.splitlines() 108 | 109 | return output 110 | 111 | 112 | ## 113 | # Search program functions and return their names and addresses 114 | # 115 | # @param regex (str) optional regular expression to search for specific functions 116 | # 117 | # @return dictionary of the type func_name->address 118 | # 119 | def search_functions(regex=''): 120 | 121 | # get the functions 122 | output = execute_output('info functions ' + regex) 123 | 124 | functions = dict() 125 | deb_funcs = list() 126 | 127 | # extract debugging functions 128 | for line in output: 129 | if re.search('\);$', line): 130 | func = line.split('(')[0].split(' ')[-1] 131 | func = func.replace('*', '') 132 | deb_funcs.append(func) 133 | 134 | # insert debugging function in dictionary 135 | for func in deb_funcs: 136 | addr = execute_output('p ' + func)[0].split(' ')[-2] 137 | addr = int(addr, 16) 138 | functions[func] = addr 139 | 140 | # insert non debugging functions in dictionary 141 | for line in output: 142 | if re.search('^0x[0-9a-f]+', line): 143 | func = line.split(' ')[-1] 144 | addr = line.split(' ')[0] 145 | addr = int(addr, 16) 146 | functions[func] = addr 147 | 148 | return functions 149 | 150 | ## 151 | # Search running processes and return their info 152 | # 153 | # @param regex (str) optional regular expression applied to the process name 154 | # 155 | # @return a list of hash maps, where every hash map contains informations about a process 156 | # 157 | def search_processes(regex=''): 158 | 159 | processes = list() 160 | 161 | # get processes via ps command 162 | output = execute_external_output('ps auxww') 163 | 164 | # delete first line 165 | output = output[1:] 166 | 167 | # parse processes info 168 | for line in output: 169 | field = re.compile('\s+').split(line) 170 | 171 | # exclude processes that don't match the regexp 172 | if regex != '': 173 | if not re.search(regex, field[10]): 174 | continue 175 | 176 | # add process info to the list 177 | processes.append({ 178 | 'user': field[0], 179 | 'pid': int(field[1]), 180 | 'percentage_cpu': eval(field[2]), 181 | 'percentage_mem': eval(field[3]), 182 | 'vsz': int(field[4]), 183 | 'rss': int(field[5]), 184 | 'tty': field[6], 185 | 'stat': field[7], 186 | 'start': field[8], 187 | 'time': field[9], 188 | 'command': field[10], 189 | 'args': field[11:] if len(field) > 11 else '' 190 | }) 191 | 192 | return processes 193 | 194 | ## 195 | # Parse disassebled output (internal function) 196 | # 197 | # @param output (list of strings) disassembled output 198 | # @param regex (str) optional regular expression applied to the instruction mnemonic 199 | # 200 | # @return list of instructions represented by a dictionary address->instr_code 201 | # 202 | def parse_disassembled_output(output, regex=''): 203 | 204 | instructions = dict() 205 | 206 | # parse output 207 | for line in output: 208 | 209 | # delete program counter mark 210 | line = line.replace('=>', ' ') 211 | 212 | # get only instruction lines 213 | if line.startswith(' '): 214 | field = re.compile('\s+').split(line) 215 | 216 | # parse 217 | if field[1].endswith(':'): 218 | addr = int(field[1].replace(':',''), 16) 219 | code = ' '.join(field[2:]) 220 | else: 221 | addr = int(field[1], 16) 222 | code = ' '.join(field[3:]) 223 | 224 | # apply regex 225 | if regex != '': 226 | if not re.search(regex, code): 227 | continue 228 | 229 | # add to instructions 230 | instructions[addr] = code 231 | 232 | return instructions 233 | 234 | 235 | ## 236 | # Disassemble a function 237 | # 238 | # @param func_name (str) name of the function to disassemble 239 | # @param regex (str) optional regular expression applied to the instruction mnemonic 240 | # 241 | # @return list of instructions represented by a dictionary address->instr_code 242 | # 243 | def disassemble_function(func_name, regex=''): 244 | 245 | # get disassembled output 246 | output = execute_output('disassemble ' + func_name) 247 | 248 | # parse and return output 249 | return parse_disassembled_output(output, regex) 250 | 251 | 252 | ## 253 | # Disassemble a range 254 | # 255 | # @param start (int) start address 256 | # @param end (int) end address 257 | # @param regex (str) optional regular expression applied to the instruction mnemonic 258 | # 259 | # @return list of instructions represented by a dictionary address->instr_code 260 | # 261 | def disassemble_range(start, end, regex=''): 262 | 263 | # get disassembled output 264 | output = execute_output('disassemble ' + str(start) + ', ' + str(end)) 265 | 266 | # parse and return output 267 | return parse_disassembled_output(output, regex) 268 | 269 | ## 270 | # Disassemble a variable number of instruction 271 | # 272 | # @param start (int) start address 273 | # @param count (int) total number of instructions to disassemble 274 | # @param regex (str) optional regular expression applied to the instruction mnemonic 275 | # 276 | # @return list of instructions represented by a dictionary address->instr_code 277 | # 278 | def disassemble_count(start, count, regex=''): 279 | 280 | # get disassembled output 281 | output = execute_output('x/' + str(count) + 'i ' + str(start)) 282 | 283 | # parse and return output 284 | return parse_disassembled_output(output, regex) 285 | 286 | ## 287 | # Disassemble and return the current instruction (pointed by the program counter register) 288 | # 289 | # @param regex (str) optional regular expression applied to the instruction mnemonic 290 | # 291 | # @return the current instruction represented by a dictionary address->instr_code 292 | # 293 | def disassemble_current_instruction(regex=''): 294 | 295 | # get disassembled output 296 | output = execute_output('x/i $pc') 297 | 298 | # parse and return output 299 | return parse_disassembled_output(output, regex) 300 | 301 | 302 | ## 303 | # Disassemble a variable number of instruction starting from the current instruction (pointed by the program counter register) 304 | # 305 | # @param count (int) total number of instructions to disassemble 306 | # @param regex (str) optional regular expression applied to the instruction mnemonic 307 | # 308 | # @return list of instructions represented by a dictionary address->instr_code 309 | # 310 | def disassemble_current_instructions(count, regex=''): 311 | 312 | # get disassembled output 313 | output = execute_output('x/' + str(count) + 'i $pc') 314 | 315 | # parse and return output 316 | return parse_disassembled_output(output, regex) 317 | 318 | ## 319 | # Get process memory mapping 320 | # 321 | # @param regex (str) optional regular expression applied name of the memory area 322 | # 323 | # @return a list of hash maps, where every hash map contains informations about a memory area 324 | # 325 | def process_mappings(regex=''): 326 | 327 | mappings = list() 328 | 329 | # get process mappings 330 | output = execute_output('info proc mappings') 331 | 332 | # parse processes mappings info 333 | for line in output: 334 | 335 | # only right lines 336 | if re.compile('^\s+0x[0-9a-f]+').search(line): 337 | field = re.compile('\s+').split(line) 338 | 339 | # provide the last field if not present (memory area name) 340 | if len(field) < 6: 341 | field.append('') 342 | 343 | # exclude memory areas that don't match the regexp 344 | if regex != '': 345 | if not re.search(regex, field[5]): 346 | continue 347 | 348 | # add mapping info to the list 349 | mappings.append({ 350 | 'start': int(field[1], 16), 351 | 'end': int(field[2], 16), 352 | 'size': int(field[3], 16), 353 | 'offset': int(field[4], 16), 354 | 'objfile': field[5] 355 | }) 356 | 357 | return mappings 358 | 359 | ## 360 | # Assemble x86/x64 assembly instructions and return a buffer containing the assembled machine code 361 | # 362 | # @param instructions (str) assembly instructions separated by a newline (basically an assembly listing) 363 | # 364 | # @return a buffer containing the assembled machine code 365 | # 366 | 367 | def assemble_instructions(instructions): 368 | 369 | # temporary files used to compile the instructions 370 | asmfilename = os.getenv('HOME') + os.sep + 'gdb_assembly_' + str(os.getpid()) + '.S' # assembly code 371 | objfilename = os.getenv('HOME') + os.sep + 'gdb_assembly_' + str(os.getpid()) + '.o' # compiled code 372 | 373 | # write assembly code (we add marks to extract the compiled fragment from the object file) 374 | asmfile = open(asmfilename, 'w') 375 | asmfile.write( 376 | "\n.ascii \"S___HERE\"\n" + 377 | instructions + 378 | "\n.ascii \"E___HERE\"\n" 379 | ) 380 | asmfile.close() 381 | 382 | # compile 383 | execute_external('gcc -c ' + asmfilename + ' -o ' + objfilename) 384 | 385 | # read compiled code 386 | objfile = open(objfilename, mode='rb') 387 | buff = objfile.read() 388 | objfile.close() 389 | 390 | # isolate code fragment 391 | start = buff.find('S___HERE') + len('S___HERE') 392 | end = buff.find('E___HERE') 393 | 394 | # delete files 395 | os.remove(asmfilename) 396 | os.remove(objfilename) 397 | 398 | return buff[start:end] 399 | 400 | ## 401 | # Get the normalized system arguments to fix a little (IMHO) gdb bug: 402 | # when the program is executed with no arguments sys.argv is equal to [''], 403 | # in this case the function returns [], otherwise returns sys.argv immutated 404 | # 405 | # @return the normalized system arguments 406 | # 407 | def normalized_argv (): 408 | if len(sys.argv) == 1 and sys.argv[0] == '': 409 | return [] 410 | else: 411 | return sys.argv 412 | 413 | -------------------------------------------------------------------------------- /html/bc_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/html/bc_s.png -------------------------------------------------------------------------------- /html/closed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/html/closed.png -------------------------------------------------------------------------------- /html/doxygen.css: -------------------------------------------------------------------------------- 1 | /* The standard CSS for doxygen */ 2 | 3 | body, table, div, p, dl { 4 | font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; 5 | font-size: 12px; 6 | } 7 | 8 | /* @group Heading Levels */ 9 | 10 | h1 { 11 | font-size: 150%; 12 | } 13 | 14 | h2 { 15 | font-size: 120%; 16 | } 17 | 18 | h3 { 19 | font-size: 100%; 20 | } 21 | 22 | dt { 23 | font-weight: bold; 24 | } 25 | 26 | div.multicol { 27 | -moz-column-gap: 1em; 28 | -webkit-column-gap: 1em; 29 | -moz-column-count: 3; 30 | -webkit-column-count: 3; 31 | } 32 | 33 | p.startli, p.startdd, p.starttd { 34 | margin-top: 2px; 35 | } 36 | 37 | p.endli { 38 | margin-bottom: 0px; 39 | } 40 | 41 | p.enddd { 42 | margin-bottom: 4px; 43 | } 44 | 45 | p.endtd { 46 | margin-bottom: 2px; 47 | } 48 | 49 | /* @end */ 50 | 51 | caption { 52 | font-weight: bold; 53 | } 54 | 55 | span.legend { 56 | font-size: 70%; 57 | text-align: center; 58 | } 59 | 60 | h3.version { 61 | font-size: 90%; 62 | text-align: center; 63 | } 64 | 65 | div.qindex, div.navtab{ 66 | background-color: #EBEFF6; 67 | border: 1px solid #A3B4D7; 68 | text-align: center; 69 | margin: 2px; 70 | padding: 2px; 71 | } 72 | 73 | div.qindex, div.navpath { 74 | width: 100%; 75 | line-height: 140%; 76 | } 77 | 78 | div.navtab { 79 | margin-right: 15px; 80 | } 81 | 82 | /* @group Link Styling */ 83 | 84 | a { 85 | color: #3D578C; 86 | font-weight: normal; 87 | text-decoration: none; 88 | } 89 | 90 | .contents a:visited { 91 | color: #4665A2; 92 | } 93 | 94 | a:hover { 95 | text-decoration: underline; 96 | } 97 | 98 | a.qindex { 99 | font-weight: bold; 100 | } 101 | 102 | a.qindexHL { 103 | font-weight: bold; 104 | background-color: #9CAFD4; 105 | color: #ffffff; 106 | border: 1px double #869DCA; 107 | } 108 | 109 | .contents a.qindexHL:visited { 110 | color: #ffffff; 111 | } 112 | 113 | a.el { 114 | font-weight: bold; 115 | } 116 | 117 | a.elRef { 118 | } 119 | 120 | a.code { 121 | color: #4665A2; 122 | } 123 | 124 | a.codeRef { 125 | color: #4665A2; 126 | } 127 | 128 | /* @end */ 129 | 130 | dl.el { 131 | margin-left: -1cm; 132 | } 133 | 134 | .fragment { 135 | font-family: monospace, fixed; 136 | font-size: 105%; 137 | } 138 | 139 | pre.fragment { 140 | border: 1px solid #C4CFE5; 141 | background-color: #FBFCFD; 142 | padding: 4px 6px; 143 | margin: 4px 8px 4px 2px; 144 | overflow: auto; 145 | word-wrap: break-word; 146 | font-size: 9pt; 147 | line-height: 125%; 148 | } 149 | 150 | div.ah { 151 | background-color: black; 152 | font-weight: bold; 153 | color: #ffffff; 154 | margin-bottom: 3px; 155 | margin-top: 3px; 156 | padding: 0.2em; 157 | border: solid thin #333; 158 | border-radius: 0.5em; 159 | -webkit-border-radius: .5em; 160 | -moz-border-radius: .5em; 161 | -webkit-box-shadow: 2px 2px 3px #999; 162 | -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; 163 | background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); 164 | background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); 165 | } 166 | 167 | div.groupHeader { 168 | margin-left: 16px; 169 | margin-top: 12px; 170 | margin-bottom: 6px; 171 | font-weight: bold; 172 | } 173 | 174 | div.groupText { 175 | margin-left: 16px; 176 | font-style: italic; 177 | } 178 | 179 | body { 180 | background: white; 181 | color: black; 182 | margin: 0; 183 | } 184 | 185 | div.contents { 186 | margin-top: 10px; 187 | margin-left: 10px; 188 | margin-right: 10px; 189 | } 190 | 191 | td.indexkey { 192 | background-color: #EBEFF6; 193 | font-weight: bold; 194 | border: 1px solid #C4CFE5; 195 | margin: 2px 0px 2px 0; 196 | padding: 2px 10px; 197 | } 198 | 199 | td.indexvalue { 200 | background-color: #EBEFF6; 201 | border: 1px solid #C4CFE5; 202 | padding: 2px 10px; 203 | margin: 2px 0px; 204 | } 205 | 206 | tr.memlist { 207 | background-color: #EEF1F7; 208 | } 209 | 210 | p.formulaDsp { 211 | text-align: center; 212 | } 213 | 214 | img.formulaDsp { 215 | 216 | } 217 | 218 | img.formulaInl { 219 | vertical-align: middle; 220 | } 221 | 222 | div.center { 223 | text-align: center; 224 | margin-top: 0px; 225 | margin-bottom: 0px; 226 | padding: 0px; 227 | } 228 | 229 | div.center img { 230 | border: 0px; 231 | } 232 | 233 | address.footer { 234 | text-align: right; 235 | padding-right: 12px; 236 | } 237 | 238 | img.footer { 239 | border: 0px; 240 | vertical-align: middle; 241 | } 242 | 243 | /* @group Code Colorization */ 244 | 245 | span.keyword { 246 | color: #008000 247 | } 248 | 249 | span.keywordtype { 250 | color: #604020 251 | } 252 | 253 | span.keywordflow { 254 | color: #e08000 255 | } 256 | 257 | span.comment { 258 | color: #800000 259 | } 260 | 261 | span.preprocessor { 262 | color: #806020 263 | } 264 | 265 | span.stringliteral { 266 | color: #002080 267 | } 268 | 269 | span.charliteral { 270 | color: #008080 271 | } 272 | 273 | span.vhdldigit { 274 | color: #ff00ff 275 | } 276 | 277 | span.vhdlchar { 278 | color: #000000 279 | } 280 | 281 | span.vhdlkeyword { 282 | color: #700070 283 | } 284 | 285 | span.vhdllogic { 286 | color: #ff0000 287 | } 288 | 289 | /* @end */ 290 | 291 | /* 292 | .search { 293 | color: #003399; 294 | font-weight: bold; 295 | } 296 | 297 | form.search { 298 | margin-bottom: 0px; 299 | margin-top: 0px; 300 | } 301 | 302 | input.search { 303 | font-size: 75%; 304 | color: #000080; 305 | font-weight: normal; 306 | background-color: #e8eef2; 307 | } 308 | */ 309 | 310 | td.tiny { 311 | font-size: 75%; 312 | } 313 | 314 | .dirtab { 315 | padding: 4px; 316 | border-collapse: collapse; 317 | border: 1px solid #A3B4D7; 318 | } 319 | 320 | th.dirtab { 321 | background: #EBEFF6; 322 | font-weight: bold; 323 | } 324 | 325 | hr { 326 | height: 0px; 327 | border: none; 328 | border-top: 1px solid #4A6AAA; 329 | } 330 | 331 | hr.footer { 332 | height: 1px; 333 | } 334 | 335 | /* @group Member Descriptions */ 336 | 337 | table.memberdecls { 338 | border-spacing: 0px; 339 | padding: 0px; 340 | } 341 | 342 | .mdescLeft, .mdescRight, 343 | .memItemLeft, .memItemRight, 344 | .memTemplItemLeft, .memTemplItemRight, .memTemplParams { 345 | background-color: #F9FAFC; 346 | border: none; 347 | margin: 4px; 348 | padding: 1px 0 0 8px; 349 | } 350 | 351 | .mdescLeft, .mdescRight { 352 | padding: 0px 8px 4px 8px; 353 | color: #555; 354 | } 355 | 356 | .memItemLeft, .memItemRight, .memTemplParams { 357 | border-top: 1px solid #C4CFE5; 358 | } 359 | 360 | .memItemLeft, .memTemplItemLeft { 361 | white-space: nowrap; 362 | } 363 | 364 | .memTemplParams { 365 | color: #4665A2; 366 | white-space: nowrap; 367 | } 368 | 369 | /* @end */ 370 | 371 | /* @group Member Details */ 372 | 373 | /* Styles for detailed member documentation */ 374 | 375 | .memtemplate { 376 | font-size: 80%; 377 | color: #4665A2; 378 | font-weight: normal; 379 | margin-left: 3px; 380 | } 381 | 382 | .memnav { 383 | background-color: #EBEFF6; 384 | border: 1px solid #A3B4D7; 385 | text-align: center; 386 | margin: 2px; 387 | margin-right: 15px; 388 | padding: 2px; 389 | } 390 | 391 | .memitem { 392 | padding: 0; 393 | margin-bottom: 10px; 394 | } 395 | 396 | .memname { 397 | white-space: nowrap; 398 | font-weight: bold; 399 | margin-left: 6px; 400 | } 401 | 402 | .memproto { 403 | border-top: 1px solid #A8B8D9; 404 | border-left: 1px solid #A8B8D9; 405 | border-right: 1px solid #A8B8D9; 406 | padding: 6px 0px 6px 0px; 407 | color: #253555; 408 | font-weight: bold; 409 | text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); 410 | /* firefox specific markup */ 411 | -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; 412 | -moz-border-radius-topright: 8px; 413 | -moz-border-radius-topleft: 8px; 414 | /* webkit specific markup */ 415 | -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); 416 | -webkit-border-top-right-radius: 8px; 417 | -webkit-border-top-left-radius: 8px; 418 | background-image:url('nav_f.png'); 419 | background-repeat:repeat-x; 420 | background-color: #E2E8F2; 421 | 422 | } 423 | 424 | .memdoc { 425 | border-bottom: 1px solid #A8B8D9; 426 | border-left: 1px solid #A8B8D9; 427 | border-right: 1px solid #A8B8D9; 428 | padding: 2px 5px; 429 | background-color: #FBFCFD; 430 | border-top-width: 0; 431 | /* firefox specific markup */ 432 | -moz-border-radius-bottomleft: 8px; 433 | -moz-border-radius-bottomright: 8px; 434 | -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; 435 | background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7); 436 | /* webkit specific markup */ 437 | -webkit-border-bottom-left-radius: 8px; 438 | -webkit-border-bottom-right-radius: 8px; 439 | -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); 440 | background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7)); 441 | } 442 | 443 | .paramkey { 444 | text-align: right; 445 | } 446 | 447 | .paramtype { 448 | white-space: nowrap; 449 | } 450 | 451 | .paramname { 452 | color: #602020; 453 | white-space: nowrap; 454 | } 455 | .paramname em { 456 | font-style: normal; 457 | } 458 | 459 | /* @end */ 460 | 461 | /* @group Directory (tree) */ 462 | 463 | /* for the tree view */ 464 | 465 | .ftvtree { 466 | font-family: sans-serif; 467 | margin: 0px; 468 | } 469 | 470 | /* these are for tree view when used as main index */ 471 | 472 | .directory { 473 | font-size: 9pt; 474 | font-weight: bold; 475 | margin: 5px; 476 | } 477 | 478 | .directory h3 { 479 | margin: 0px; 480 | margin-top: 1em; 481 | font-size: 11pt; 482 | } 483 | 484 | /* 485 | The following two styles can be used to replace the root node title 486 | with an image of your choice. Simply uncomment the next two styles, 487 | specify the name of your image and be sure to set 'height' to the 488 | proper pixel height of your image. 489 | */ 490 | 491 | /* 492 | .directory h3.swap { 493 | height: 61px; 494 | background-repeat: no-repeat; 495 | background-image: url("yourimage.gif"); 496 | } 497 | .directory h3.swap span { 498 | display: none; 499 | } 500 | */ 501 | 502 | .directory > h3 { 503 | margin-top: 0; 504 | } 505 | 506 | .directory p { 507 | margin: 0px; 508 | white-space: nowrap; 509 | } 510 | 511 | .directory div { 512 | display: none; 513 | margin: 0px; 514 | } 515 | 516 | .directory img { 517 | vertical-align: -30%; 518 | } 519 | 520 | /* these are for tree view when not used as main index */ 521 | 522 | .directory-alt { 523 | font-size: 100%; 524 | font-weight: bold; 525 | } 526 | 527 | .directory-alt h3 { 528 | margin: 0px; 529 | margin-top: 1em; 530 | font-size: 11pt; 531 | } 532 | 533 | .directory-alt > h3 { 534 | margin-top: 0; 535 | } 536 | 537 | .directory-alt p { 538 | margin: 0px; 539 | white-space: nowrap; 540 | } 541 | 542 | .directory-alt div { 543 | display: none; 544 | margin: 0px; 545 | } 546 | 547 | .directory-alt img { 548 | vertical-align: -30%; 549 | } 550 | 551 | /* @end */ 552 | 553 | div.dynheader { 554 | margin-top: 8px; 555 | } 556 | 557 | address { 558 | font-style: normal; 559 | color: #2A3D61; 560 | } 561 | 562 | table.doxtable { 563 | border-collapse:collapse; 564 | } 565 | 566 | table.doxtable td, table.doxtable th { 567 | border: 1px solid #2D4068; 568 | padding: 3px 7px 2px; 569 | } 570 | 571 | table.doxtable th { 572 | background-color: #374F7F; 573 | color: #FFFFFF; 574 | font-size: 110%; 575 | padding-bottom: 4px; 576 | padding-top: 5px; 577 | text-align:left; 578 | } 579 | 580 | .tabsearch { 581 | top: 0px; 582 | left: 10px; 583 | height: 36px; 584 | background-image: url('tab_b.png'); 585 | z-index: 101; 586 | overflow: hidden; 587 | font-size: 13px; 588 | } 589 | 590 | .navpath ul 591 | { 592 | font-size: 11px; 593 | background-image:url('tab_b.png'); 594 | background-repeat:repeat-x; 595 | height:30px; 596 | line-height:30px; 597 | color:#8AA0CC; 598 | border:solid 1px #C2CDE4; 599 | overflow:hidden; 600 | margin:0px; 601 | padding:0px; 602 | } 603 | 604 | .navpath li 605 | { 606 | list-style-type:none; 607 | float:left; 608 | padding-left:10px; 609 | padding-right: 15px; 610 | background-image:url('bc_s.png'); 611 | background-repeat:no-repeat; 612 | background-position:right; 613 | color:#364D7C; 614 | } 615 | 616 | .navpath a 617 | { 618 | height:32px; 619 | display:block; 620 | text-decoration: none; 621 | outline: none; 622 | } 623 | 624 | .navpath a:hover 625 | { 626 | color:#6884BD; 627 | } 628 | 629 | div.summary 630 | { 631 | float: right; 632 | font-size: 8pt; 633 | padding-right: 5px; 634 | width: 50%; 635 | text-align: right; 636 | } 637 | 638 | div.summary a 639 | { 640 | white-space: nowrap; 641 | } 642 | 643 | div.header 644 | { 645 | background-image:url('nav_h.png'); 646 | background-repeat:repeat-x; 647 | background-color: #F9FAFC; 648 | margin: 0px; 649 | border-bottom: 1px solid #C4CFE5; 650 | } 651 | 652 | div.headertitle 653 | { 654 | padding: 5px 5px 5px 10px; 655 | } 656 | 657 | -------------------------------------------------------------------------------- /html/doxygen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/html/doxygen.png -------------------------------------------------------------------------------- /html/files.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | File Index 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 16 | 46 |
47 |
48 |

File List

49 |
50 |
51 | Here is a list of all files with brief descriptions: 52 | 53 |
gdb_utils.py
54 |
55 | 56 | 61 | 62 | 63 |
64 | 67 |
68 | 69 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /html/gdb__utils_8py.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | gdb_utils.py File Reference 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 16 | 46 |
47 |
48 | Namespaces | 49 | Functions
50 |
51 |

gdb_utils.py File Reference

52 |
53 |
54 | 55 | 57 | 58 | 59 |

61 |

62 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 |

56 | Namespaces

namespace  gdb_utils
 

Various utility functions to work with GDB.

60 |

63 | Functions

def gdb_utils::read_string
 Read an ASCII string from memory.
def gdb_utils::execute_output
 Execute a GDB command with output capture.
def gdb_utils::execute_external
 Execute external command.
def gdb_utils::execute_external_output
 Execute external command with output capture.
def gdb_utils::search_functions
 Search program functions and return their names and addresses.
def gdb_utils::search_processes
 Search running processes and return their info.
def gdb_utils::parse_disassembled_output
 Parse disassebled output (internal function).
def gdb_utils::disassemble_function
 Disassemble a function.
def gdb_utils::disassemble_range
 Disassemble a range.
def gdb_utils::disassemble_count
 Disassemble a variable number of instruction.
def gdb_utils::disassemble_current_instruction
 Disassemble and return the current instruction (pointed by the program counter register).
def gdb_utils::disassemble_current_instructions
 Disassemble a variable number of instruction starting from the current instruction (pointed by the program counter register).
def gdb_utils::process_mappings
 Get process memory mapping.
def gdb_utils::assemble_instructions
 Assemble x86/x64 assembly instructions and return a buffer containing the assembled machine code.
def gdb_utils::normalized_argv
 Get the normalized system arguments to fix a little (IMHO) gdb bug: when the program is executed with no arguments sys.argv is equal to [''], in this case the function returns [], otherwise returns sys.argv immutated.
95 |
96 | 97 | 102 | 103 | 104 |
105 | 108 |
109 | 110 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Main Page 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 16 | 41 |
42 |
43 | 44 | 49 | 50 | 51 |
52 | 55 |
56 | 57 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /html/installdox: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | %subst = ( ); 4 | $quiet = 0; 5 | 6 | if (open(F,"search.cfg")) 7 | { 8 | $_= ; s/[ \t\n]*$//g ; $subst{"_doc"} = $_; 9 | $_= ; s/[ \t\n]*$//g ; $subst{"_cgi"} = $_; 10 | } 11 | 12 | while ( @ARGV ) { 13 | $_ = shift @ARGV; 14 | if ( s/^-// ) { 15 | if ( /^l(.*)/ ) { 16 | $v = ($1 eq "") ? shift @ARGV : $1; 17 | ($v =~ /\/$/) || ($v .= "/"); 18 | $_ = $v; 19 | if ( /(.+)\@(.+)/ ) { 20 | if ( exists $subst{$1} ) { 21 | $subst{$1} = $2; 22 | } else { 23 | print STDERR "Unknown tag file $1 given with option -l\n"; 24 | &usage(); 25 | } 26 | } else { 27 | print STDERR "Argument $_ is invalid for option -l\n"; 28 | &usage(); 29 | } 30 | } 31 | elsif ( /^q/ ) { 32 | $quiet = 1; 33 | } 34 | elsif ( /^\?|^h/ ) { 35 | &usage(); 36 | } 37 | else { 38 | print STDERR "Illegal option -$_\n"; 39 | &usage(); 40 | } 41 | } 42 | else { 43 | push (@files, $_ ); 44 | } 45 | } 46 | 47 | foreach $sub (keys %subst) 48 | { 49 | if ( $subst{$sub} eq "" ) 50 | { 51 | print STDERR "No substitute given for tag file `$sub'\n"; 52 | &usage(); 53 | } 54 | elsif ( ! $quiet && $sub ne "_doc" && $sub ne "_cgi" ) 55 | { 56 | print "Substituting $subst{$sub} for each occurrence of tag file $sub\n"; 57 | } 58 | } 59 | 60 | if ( ! @files ) { 61 | if (opendir(D,".")) { 62 | foreach $file ( readdir(D) ) { 63 | $match = ".html"; 64 | next if ( $file =~ /^\.\.?$/ ); 65 | ($file =~ /$match/) && (push @files, $file); 66 | ($file =~ "tree.js") && (push @files, $file); 67 | } 68 | closedir(D); 69 | } 70 | } 71 | 72 | if ( ! @files ) { 73 | print STDERR "Warning: No input files given and none found!\n"; 74 | } 75 | 76 | foreach $f (@files) 77 | { 78 | if ( ! $quiet ) { 79 | print "Editing: $f...\n"; 80 | } 81 | $oldf = $f; 82 | $f .= ".bak"; 83 | unless (rename $oldf,$f) { 84 | print STDERR "Error: cannot rename file $oldf\n"; 85 | exit 1; 86 | } 87 | if (open(F,"<$f")) { 88 | unless (open(G,">$oldf")) { 89 | print STDERR "Error: opening file $oldf for writing\n"; 90 | exit 1; 91 | } 92 | if ($oldf ne "tree.js") { 93 | while () { 94 | s/doxygen\=\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\" (href|src)=\"\2/doxygen\=\"$1:$subst{$1}\" \3=\"$subst{$1}/g; 95 | print G "$_"; 96 | } 97 | } 98 | else { 99 | while () { 100 | s/\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\", \"\2/\"$1:$subst{$1}\" ,\"$subst{$1}/g; 101 | print G "$_"; 102 | } 103 | } 104 | } 105 | else { 106 | print STDERR "Warning file $f does not exist\n"; 107 | } 108 | unlink $f; 109 | } 110 | 111 | sub usage { 112 | print STDERR "Usage: installdox [options] [html-file [html-file ...]]\n"; 113 | print STDERR "Options:\n"; 114 | print STDERR " -l tagfile\@linkName tag file + URL or directory \n"; 115 | print STDERR " -q Quiet mode\n\n"; 116 | exit 1; 117 | } 118 | -------------------------------------------------------------------------------- /html/namespacemembers.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Class Members 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 16 | 53 |
54 | Here is a list of all namespace members with links to the namespace documentation for each member:
    55 |
  • assemble_instructions() 56 | : gdb_utils 57 |
  • 58 |
  • disassemble_count() 59 | : gdb_utils 60 |
  • 61 |
  • disassemble_current_instruction() 62 | : gdb_utils 63 |
  • 64 |
  • disassemble_current_instructions() 65 | : gdb_utils 66 |
  • 67 |
  • disassemble_function() 68 | : gdb_utils 69 |
  • 70 |
  • disassemble_range() 71 | : gdb_utils 72 |
  • 73 |
  • execute_external() 74 | : gdb_utils 75 |
  • 76 |
  • execute_external_output() 77 | : gdb_utils 78 |
  • 79 |
  • execute_output() 80 | : gdb_utils 81 |
  • 82 |
  • normalized_argv() 83 | : gdb_utils 84 |
  • 85 |
  • parse_disassembled_output() 86 | : gdb_utils 87 |
  • 88 |
  • process_mappings() 89 | : gdb_utils 90 |
  • 91 |
  • read_string() 92 | : gdb_utils 93 |
  • 94 |
  • search_functions() 95 | : gdb_utils 96 |
  • 97 |
  • search_processes() 98 | : gdb_utils 99 |
  • 100 |
101 |
102 | 103 | 108 | 109 | 110 |
111 | 114 |
115 | 116 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /html/namespacemembers_func.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Class Members 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 16 | 53 |
54 |  
    55 |
  • assemble_instructions() 56 | : gdb_utils 57 |
  • 58 |
  • disassemble_count() 59 | : gdb_utils 60 |
  • 61 |
  • disassemble_current_instruction() 62 | : gdb_utils 63 |
  • 64 |
  • disassemble_current_instructions() 65 | : gdb_utils 66 |
  • 67 |
  • disassemble_function() 68 | : gdb_utils 69 |
  • 70 |
  • disassemble_range() 71 | : gdb_utils 72 |
  • 73 |
  • execute_external() 74 | : gdb_utils 75 |
  • 76 |
  • execute_external_output() 77 | : gdb_utils 78 |
  • 79 |
  • execute_output() 80 | : gdb_utils 81 |
  • 82 |
  • normalized_argv() 83 | : gdb_utils 84 |
  • 85 |
  • parse_disassembled_output() 86 | : gdb_utils 87 |
  • 88 |
  • process_mappings() 89 | : gdb_utils 90 |
  • 91 |
  • read_string() 92 | : gdb_utils 93 |
  • 94 |
  • search_functions() 95 | : gdb_utils 96 |
  • 97 |
  • search_processes() 98 | : gdb_utils 99 |
  • 100 |
101 |
102 | 103 | 108 | 109 | 110 |
111 | 114 |
115 | 116 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /html/namespaces.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Namespace Index 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 16 | 47 |
48 |
49 |

Namespace List

50 |
51 |
52 | Here is a list of all namespaces with brief descriptions: 53 | 54 |
gdb_utilsVarious utility functions to work with GDB
55 |
56 | 57 | 62 | 63 | 64 |
65 | 68 |
69 | 70 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /html/nav_f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/html/nav_f.png -------------------------------------------------------------------------------- /html/nav_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/html/nav_h.png -------------------------------------------------------------------------------- /html/open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/html/open.png -------------------------------------------------------------------------------- /html/search/all_61.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | assemble_instructions 13 | gdb_utils 14 |
15 |
16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /html/search/all_64.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | disassemble_count 13 | gdb_utils 14 |
15 |
16 |
17 |
18 | disassemble_current_instruction 19 | gdb_utils 20 |
21 |
22 |
23 |
24 | disassemble_current_instructions 25 | gdb_utils 26 |
27 |
28 |
29 |
30 | disassemble_function 31 | gdb_utils 32 |
33 |
34 |
35 |
36 | disassemble_range 37 | gdb_utils 38 |
39 |
40 |
Searching...
41 |
No Matches
42 | 48 |
49 | 50 | 51 | -------------------------------------------------------------------------------- /html/search/all_65.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | execute_external 13 | gdb_utils 14 |
15 |
16 |
17 |
18 | execute_external_output 19 | gdb_utils 20 |
21 |
22 |
23 |
24 | execute_output 25 | gdb_utils 26 |
27 |
28 |
Searching...
29 |
No Matches
30 | 36 |
37 | 38 | 39 | -------------------------------------------------------------------------------- /html/search/all_67.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | gdb_utils 13 |
14 |
15 |
16 |
17 | gdb_utils.py 18 |
19 |
20 |
Searching...
21 |
No Matches
22 | 28 |
29 | 30 | 31 | -------------------------------------------------------------------------------- /html/search/all_6e.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | normalized_argv 13 | gdb_utils 14 |
15 |
16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /html/search/all_70.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | parse_disassembled_output 13 | gdb_utils 14 |
15 |
16 |
17 |
18 | process_mappings 19 | gdb_utils 20 |
21 |
22 |
Searching...
23 |
No Matches
24 | 30 |
31 | 32 | 33 | -------------------------------------------------------------------------------- /html/search/all_72.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | read_string 13 | gdb_utils 14 |
15 |
16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /html/search/all_73.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | search_functions 13 | gdb_utils 14 |
15 |
16 |
17 |
18 | search_processes 19 | gdb_utils 20 |
21 |
22 |
Searching...
23 |
No Matches
24 | 30 |
31 | 32 | 33 | -------------------------------------------------------------------------------- /html/search/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/html/search/close.png -------------------------------------------------------------------------------- /html/search/files_67.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | gdb_utils.py 13 |
14 |
15 |
Searching...
16 |
No Matches
17 | 23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /html/search/functions_61.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | assemble_instructions 13 | gdb_utils 14 |
15 |
16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /html/search/functions_64.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | disassemble_count 13 | gdb_utils 14 |
15 |
16 |
17 |
18 | disassemble_current_instruction 19 | gdb_utils 20 |
21 |
22 |
23 |
24 | disassemble_current_instructions 25 | gdb_utils 26 |
27 |
28 |
29 |
30 | disassemble_function 31 | gdb_utils 32 |
33 |
34 |
35 |
36 | disassemble_range 37 | gdb_utils 38 |
39 |
40 |
Searching...
41 |
No Matches
42 | 48 |
49 | 50 | 51 | -------------------------------------------------------------------------------- /html/search/functions_65.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | execute_external 13 | gdb_utils 14 |
15 |
16 |
17 |
18 | execute_external_output 19 | gdb_utils 20 |
21 |
22 |
23 |
24 | execute_output 25 | gdb_utils 26 |
27 |
28 |
Searching...
29 |
No Matches
30 | 36 |
37 | 38 | 39 | -------------------------------------------------------------------------------- /html/search/functions_67.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | get_current_instruction 13 | gdb_utils 14 |
15 |
16 |
17 |
18 | get_current_instructions 19 | gdb_utils 20 |
21 |
22 |
Searching...
23 |
No Matches
24 | 30 |
31 | 32 | 33 | -------------------------------------------------------------------------------- /html/search/functions_6e.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | normalized_argv 13 | gdb_utils 14 |
15 |
16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /html/search/functions_70.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | parse_disassembled_output 13 | gdb_utils 14 |
15 |
16 |
17 |
18 | process_mappings 19 | gdb_utils 20 |
21 |
22 |
Searching...
23 |
No Matches
24 | 30 |
31 | 32 | 33 | -------------------------------------------------------------------------------- /html/search/functions_72.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | read_string 13 | gdb_utils 14 |
15 |
16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /html/search/functions_73.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | search_functions 13 | gdb_utils 14 |
15 |
16 |
17 |
18 | search_processes 19 | gdb_utils 20 |
21 |
22 |
Searching...
23 |
No Matches
24 | 30 |
31 | 32 | 33 | -------------------------------------------------------------------------------- /html/search/mag_sel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/html/search/mag_sel.png -------------------------------------------------------------------------------- /html/search/namespaces_67.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
Loading...
10 |
11 |
12 | gdb_utils 13 |
14 |
15 |
Searching...
16 |
No Matches
17 | 23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /html/search/nomatches.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
No Matches
10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /html/search/search.css: -------------------------------------------------------------------------------- 1 | /*---------------- Search Box */ 2 | 3 | #FSearchBox { 4 | float: left; 5 | } 6 | 7 | #searchli { 8 | float: right; 9 | display: block; 10 | width: 170px; 11 | height: 36px; 12 | } 13 | 14 | #MSearchBox { 15 | white-space : nowrap; 16 | position: absolute; 17 | float: none; 18 | display: inline; 19 | margin-top: 8px; 20 | right: 0px; 21 | width: 170px; 22 | z-index: 102; 23 | } 24 | 25 | #MSearchBox .left 26 | { 27 | display:block; 28 | position:absolute; 29 | left:10px; 30 | width:20px; 31 | height:19px; 32 | background:url('search_l.png') no-repeat; 33 | background-position:right; 34 | } 35 | 36 | #MSearchSelect { 37 | display:block; 38 | position:absolute; 39 | width:20px; 40 | height:19px; 41 | } 42 | 43 | .left #MSearchSelect { 44 | left:4px; 45 | } 46 | 47 | .right #MSearchSelect { 48 | right:5px; 49 | } 50 | 51 | #MSearchField { 52 | display:block; 53 | position:absolute; 54 | height:19px; 55 | background:url('search_m.png') repeat-x; 56 | border:none; 57 | width:116px; 58 | margin-left:20px; 59 | padding-left:4px; 60 | color: #909090; 61 | outline: none; 62 | font: 9pt Arial, Verdana, sans-serif; 63 | } 64 | 65 | #FSearchBox #MSearchField { 66 | margin-left:15px; 67 | } 68 | 69 | #MSearchBox .right { 70 | display:block; 71 | position:absolute; 72 | right:10px; 73 | top:0px; 74 | width:20px; 75 | height:19px; 76 | background:url('search_r.png') no-repeat; 77 | background-position:left; 78 | } 79 | 80 | #MSearchClose { 81 | display: none; 82 | position: absolute; 83 | top: 4px; 84 | background : none; 85 | border: none; 86 | margin: 0px 4px 0px 0px; 87 | padding: 0px 0px; 88 | outline: none; 89 | } 90 | 91 | .left #MSearchClose { 92 | left: 6px; 93 | } 94 | 95 | .right #MSearchClose { 96 | right: 2px; 97 | } 98 | 99 | .MSearchBoxActive #MSearchField { 100 | color: #000000; 101 | } 102 | 103 | /*---------------- Search filter selection */ 104 | 105 | #MSearchSelectWindow { 106 | display: none; 107 | position: absolute; 108 | left: 0; top: 0; 109 | border: 1px solid #90A5CE; 110 | background-color: #F9FAFC; 111 | z-index: 1; 112 | padding-top: 4px; 113 | padding-bottom: 4px; 114 | -moz-border-radius: 4px; 115 | -webkit-border-top-left-radius: 4px; 116 | -webkit-border-top-right-radius: 4px; 117 | -webkit-border-bottom-left-radius: 4px; 118 | -webkit-border-bottom-right-radius: 4px; 119 | -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); 120 | } 121 | 122 | .SelectItem { 123 | font: 8pt Arial, Verdana, sans-serif; 124 | padding-left: 2px; 125 | padding-right: 12px; 126 | border: 0px; 127 | } 128 | 129 | span.SelectionMark { 130 | margin-right: 4px; 131 | font-family: monospace; 132 | outline-style: none; 133 | text-decoration: none; 134 | } 135 | 136 | a.SelectItem { 137 | display: block; 138 | outline-style: none; 139 | color: #000000; 140 | text-decoration: none; 141 | padding-left: 6px; 142 | padding-right: 12px; 143 | } 144 | 145 | a.SelectItem:focus, 146 | a.SelectItem:active { 147 | color: #000000; 148 | outline-style: none; 149 | text-decoration: none; 150 | } 151 | 152 | a.SelectItem:hover { 153 | color: #FFFFFF; 154 | background-color: #3D578C; 155 | outline-style: none; 156 | text-decoration: none; 157 | cursor: pointer; 158 | display: block; 159 | } 160 | 161 | /*---------------- Search results window */ 162 | 163 | iframe#MSearchResults { 164 | width: 60ex; 165 | height: 15em; 166 | } 167 | 168 | #MSearchResultsWindow { 169 | display: none; 170 | position: absolute; 171 | left: 0; top: 0; 172 | border: 1px solid #000; 173 | background-color: #EEF1F7; 174 | } 175 | 176 | /* ----------------------------------- */ 177 | 178 | 179 | #SRIndex { 180 | clear:both; 181 | padding-bottom: 15px; 182 | } 183 | 184 | .SREntry { 185 | font-size: 10pt; 186 | padding-left: 1ex; 187 | } 188 | 189 | .SRPage .SREntry { 190 | font-size: 8pt; 191 | padding: 1px 5px; 192 | } 193 | 194 | body.SRPage { 195 | margin: 5px 2px; 196 | } 197 | 198 | .SRChildren { 199 | padding-left: 3ex; padding-bottom: .5em 200 | } 201 | 202 | .SRPage .SRChildren { 203 | display: none; 204 | } 205 | 206 | .SRSymbol { 207 | font-weight: bold; 208 | color: #425E97; 209 | font-family: Arial, Verdana, sans-serif; 210 | text-decoration: none; 211 | outline: none; 212 | } 213 | 214 | a.SRScope { 215 | display: block; 216 | color: #425E97; 217 | font-family: Arial, Verdana, sans-serif; 218 | text-decoration: none; 219 | outline: none; 220 | } 221 | 222 | a.SRSymbol:focus, a.SRSymbol:active, 223 | a.SRScope:focus, a.SRScope:active { 224 | text-decoration: underline; 225 | } 226 | 227 | .SRPage .SRStatus { 228 | padding: 2px 5px; 229 | font-size: 8pt; 230 | font-style: italic; 231 | } 232 | 233 | .SRResult { 234 | display: none; 235 | } 236 | 237 | DIV.searchresults { 238 | margin-left: 10px; 239 | margin-right: 10px; 240 | } 241 | -------------------------------------------------------------------------------- /html/search/search.js: -------------------------------------------------------------------------------- 1 | // Search script generated by doxygen 2 | // Copyright (C) 2009 by Dimitri van Heesch. 3 | 4 | // The code in this file is loosly based on main.js, part of Natural Docs, 5 | // which is Copyright (C) 2003-2008 Greg Valure 6 | // Natural Docs is licensed under the GPL. 7 | 8 | var indexSectionsWithContent = 9 | { 10 | 0: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100110100000010101100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 11 | 1: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 12 | 2: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 13 | 3: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100110000000010101100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" 14 | }; 15 | 16 | var indexSectionNames = 17 | { 18 | 0: "all", 19 | 1: "namespaces", 20 | 2: "files", 21 | 3: "functions" 22 | }; 23 | 24 | function convertToId(search) 25 | { 26 | var result = ''; 27 | for (i=0;i do a search 285 | { 286 | this.Search(); 287 | } 288 | } 289 | 290 | this.OnSearchSelectKey = function(evt) 291 | { 292 | var e = (evt) ? evt : window.event; // for IE 293 | if (e.keyCode==40 && this.searchIndex0) // Up 299 | { 300 | this.searchIndex--; 301 | this.OnSelectItem(this.searchIndex); 302 | } 303 | else if (e.keyCode==13 || e.keyCode==27) 304 | { 305 | this.OnSelectItem(this.searchIndex); 306 | this.CloseSelectionWindow(); 307 | this.DOMSearchField().focus(); 308 | } 309 | return false; 310 | } 311 | 312 | // --------- Actions 313 | 314 | // Closes the results window. 315 | this.CloseResultsWindow = function() 316 | { 317 | this.DOMPopupSearchResultsWindow().style.display = 'none'; 318 | this.DOMSearchClose().style.display = 'none'; 319 | this.Activate(false); 320 | } 321 | 322 | this.CloseSelectionWindow = function() 323 | { 324 | this.DOMSearchSelectWindow().style.display = 'none'; 325 | } 326 | 327 | // Performs a search. 328 | this.Search = function() 329 | { 330 | this.keyTimeout = 0; 331 | 332 | // strip leading whitespace 333 | var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); 334 | 335 | var code = searchValue.toLowerCase().charCodeAt(0); 336 | var hexCode; 337 | if (code<16) 338 | { 339 | hexCode="0"+code.toString(16); 340 | } 341 | else 342 | { 343 | hexCode=code.toString(16); 344 | } 345 | 346 | var resultsPage; 347 | var resultsPageWithSearch; 348 | var hasResultsPage; 349 | 350 | if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1') 351 | { 352 | resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; 353 | resultsPageWithSearch = resultsPage+'?'+escape(searchValue); 354 | hasResultsPage = true; 355 | } 356 | else // nothing available for this search term 357 | { 358 | resultsPage = this.resultsPath + '/nomatches.html'; 359 | resultsPageWithSearch = resultsPage; 360 | hasResultsPage = false; 361 | } 362 | 363 | window.frames.MSearchResults.location.href = resultsPageWithSearch; 364 | var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); 365 | 366 | if (domPopupSearchResultsWindow.style.display!='block') 367 | { 368 | var domSearchBox = this.DOMSearchBox(); 369 | this.DOMSearchClose().style.display = 'inline'; 370 | if (this.insideFrame) 371 | { 372 | var domPopupSearchResults = this.DOMPopupSearchResults(); 373 | domPopupSearchResultsWindow.style.position = 'relative'; 374 | domPopupSearchResultsWindow.style.display = 'block'; 375 | var width = document.body.clientWidth - 8; // the -8 is for IE :-( 376 | domPopupSearchResultsWindow.style.width = width + 'px'; 377 | domPopupSearchResults.style.width = width + 'px'; 378 | } 379 | else 380 | { 381 | var domPopupSearchResults = this.DOMPopupSearchResults(); 382 | var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; 383 | var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; 384 | domPopupSearchResultsWindow.style.display = 'block'; 385 | left -= domPopupSearchResults.offsetWidth; 386 | domPopupSearchResultsWindow.style.top = top + 'px'; 387 | domPopupSearchResultsWindow.style.left = left + 'px'; 388 | } 389 | } 390 | 391 | this.lastSearchValue = searchValue; 392 | this.lastResultsPage = resultsPage; 393 | } 394 | 395 | // -------- Activation Functions 396 | 397 | // Activates or deactivates the search panel, resetting things to 398 | // their default values if necessary. 399 | this.Activate = function(isActive) 400 | { 401 | if (isActive || // open it 402 | this.DOMPopupSearchResultsWindow().style.display == 'block' 403 | ) 404 | { 405 | this.DOMSearchBox().className = 'MSearchBoxActive'; 406 | 407 | var searchField = this.DOMSearchField(); 408 | 409 | if (searchField.value == this.searchLabel) // clear "Search" term upon entry 410 | { 411 | searchField.value = ''; 412 | this.searchActive = true; 413 | } 414 | } 415 | else if (!isActive) // directly remove the panel 416 | { 417 | this.DOMSearchBox().className = 'MSearchBoxInactive'; 418 | this.DOMSearchField().value = this.searchLabel; 419 | this.searchActive = false; 420 | this.lastSearchValue = '' 421 | this.lastResultsPage = ''; 422 | } 423 | } 424 | } 425 | 426 | // ----------------------------------------------------------------------- 427 | 428 | // The class that handles everything on the search results page. 429 | function SearchResults(name) 430 | { 431 | // The number of matches from the last run of . 432 | this.lastMatchCount = 0; 433 | this.lastKey = 0; 434 | this.repeatOn = false; 435 | 436 | // Toggles the visibility of the passed element ID. 437 | this.FindChildElement = function(id) 438 | { 439 | var parentElement = document.getElementById(id); 440 | var element = parentElement.firstChild; 441 | 442 | while (element && element!=parentElement) 443 | { 444 | if (element.nodeName == 'DIV' && element.className == 'SRChildren') 445 | { 446 | return element; 447 | } 448 | 449 | if (element.nodeName == 'DIV' && element.hasChildNodes()) 450 | { 451 | element = element.firstChild; 452 | } 453 | else if (element.nextSibling) 454 | { 455 | element = element.nextSibling; 456 | } 457 | else 458 | { 459 | do 460 | { 461 | element = element.parentNode; 462 | } 463 | while (element && element!=parentElement && !element.nextSibling); 464 | 465 | if (element && element!=parentElement) 466 | { 467 | element = element.nextSibling; 468 | } 469 | } 470 | } 471 | } 472 | 473 | this.Toggle = function(id) 474 | { 475 | var element = this.FindChildElement(id); 476 | if (element) 477 | { 478 | if (element.style.display == 'block') 479 | { 480 | element.style.display = 'none'; 481 | } 482 | else 483 | { 484 | element.style.display = 'block'; 485 | } 486 | } 487 | } 488 | 489 | // Searches for the passed string. If there is no parameter, 490 | // it takes it from the URL query. 491 | // 492 | // Always returns true, since other documents may try to call it 493 | // and that may or may not be possible. 494 | this.Search = function(search) 495 | { 496 | if (!search) // get search word from URL 497 | { 498 | search = window.location.search; 499 | search = search.substring(1); // Remove the leading '?' 500 | search = unescape(search); 501 | } 502 | 503 | search = search.replace(/^ +/, ""); // strip leading spaces 504 | search = search.replace(/ +$/, ""); // strip trailing spaces 505 | search = search.toLowerCase(); 506 | search = convertToId(search); 507 | 508 | var resultRows = document.getElementsByTagName("div"); 509 | var matches = 0; 510 | 511 | var i = 0; 512 | while (i < resultRows.length) 513 | { 514 | var row = resultRows.item(i); 515 | if (row.className == "SRResult") 516 | { 517 | var rowMatchName = row.id.toLowerCase(); 518 | rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' 519 | 520 | if (search.length<=rowMatchName.length && 521 | rowMatchName.substr(0, search.length)==search) 522 | { 523 | row.style.display = 'block'; 524 | matches++; 525 | } 526 | else 527 | { 528 | row.style.display = 'none'; 529 | } 530 | } 531 | i++; 532 | } 533 | document.getElementById("Searching").style.display='none'; 534 | if (matches == 0) // no results 535 | { 536 | document.getElementById("NoMatches").style.display='block'; 537 | } 538 | else // at least one result 539 | { 540 | document.getElementById("NoMatches").style.display='none'; 541 | } 542 | this.lastMatchCount = matches; 543 | return true; 544 | } 545 | 546 | // return the first item with index index or higher that is visible 547 | this.NavNext = function(index) 548 | { 549 | var focusItem; 550 | while (1) 551 | { 552 | var focusName = 'Item'+index; 553 | focusItem = document.getElementById(focusName); 554 | if (focusItem && focusItem.parentNode.parentNode.style.display=='block') 555 | { 556 | break; 557 | } 558 | else if (!focusItem) // last element 559 | { 560 | break; 561 | } 562 | focusItem=null; 563 | index++; 564 | } 565 | return focusItem; 566 | } 567 | 568 | this.NavPrev = function(index) 569 | { 570 | var focusItem; 571 | while (1) 572 | { 573 | var focusName = 'Item'+index; 574 | focusItem = document.getElementById(focusName); 575 | if (focusItem && focusItem.parentNode.parentNode.style.display=='block') 576 | { 577 | break; 578 | } 579 | else if (!focusItem) // last element 580 | { 581 | break; 582 | } 583 | focusItem=null; 584 | index--; 585 | } 586 | return focusItem; 587 | } 588 | 589 | this.ProcessKeys = function(e) 590 | { 591 | if (e.type == "keydown") 592 | { 593 | this.repeatOn = false; 594 | this.lastKey = e.keyCode; 595 | } 596 | else if (e.type == "keypress") 597 | { 598 | if (!this.repeatOn) 599 | { 600 | if (this.lastKey) this.repeatOn = true; 601 | return false; // ignore first keypress after keydown 602 | } 603 | } 604 | else if (e.type == "keyup") 605 | { 606 | this.lastKey = 0; 607 | this.repeatOn = false; 608 | } 609 | return this.lastKey!=0; 610 | } 611 | 612 | this.Nav = function(evt,itemIndex) 613 | { 614 | var e = (evt) ? evt : window.event; // for IE 615 | if (e.keyCode==13) return true; 616 | if (!this.ProcessKeys(e)) return false; 617 | 618 | if (this.lastKey==38) // Up 619 | { 620 | var newIndex = itemIndex-1; 621 | var focusItem = this.NavPrev(newIndex); 622 | if (focusItem) 623 | { 624 | var child = this.FindChildElement(focusItem.parentNode.parentNode.id); 625 | if (child && child.style.display == 'block') // children visible 626 | { 627 | var n=0; 628 | var tmpElem; 629 | while (1) // search for last child 630 | { 631 | tmpElem = document.getElementById('Item'+newIndex+'_c'+n); 632 | if (tmpElem) 633 | { 634 | focusItem = tmpElem; 635 | } 636 | else // found it! 637 | { 638 | break; 639 | } 640 | n++; 641 | } 642 | } 643 | } 644 | if (focusItem) 645 | { 646 | focusItem.focus(); 647 | } 648 | else // return focus to search field 649 | { 650 | parent.document.getElementById("MSearchField").focus(); 651 | } 652 | } 653 | else if (this.lastKey==40) // Down 654 | { 655 | var newIndex = itemIndex+1; 656 | var focusItem; 657 | var item = document.getElementById('Item'+itemIndex); 658 | var elem = this.FindChildElement(item.parentNode.parentNode.id); 659 | if (elem && elem.style.display == 'block') // children visible 660 | { 661 | focusItem = document.getElementById('Item'+itemIndex+'_c0'); 662 | } 663 | if (!focusItem) focusItem = this.NavNext(newIndex); 664 | if (focusItem) focusItem.focus(); 665 | } 666 | else if (this.lastKey==39) // Right 667 | { 668 | var item = document.getElementById('Item'+itemIndex); 669 | var elem = this.FindChildElement(item.parentNode.parentNode.id); 670 | if (elem) elem.style.display = 'block'; 671 | } 672 | else if (this.lastKey==37) // Left 673 | { 674 | var item = document.getElementById('Item'+itemIndex); 675 | var elem = this.FindChildElement(item.parentNode.parentNode.id); 676 | if (elem) elem.style.display = 'none'; 677 | } 678 | else if (this.lastKey==27) // Escape 679 | { 680 | parent.searchBox.CloseResultsWindow(); 681 | parent.document.getElementById("MSearchField").focus(); 682 | } 683 | else if (this.lastKey==13) // Enter 684 | { 685 | return true; 686 | } 687 | return false; 688 | } 689 | 690 | this.NavChild = function(evt,itemIndex,childIndex) 691 | { 692 | var e = (evt) ? evt : window.event; // for IE 693 | if (e.keyCode==13) return true; 694 | if (!this.ProcessKeys(e)) return false; 695 | 696 | if (this.lastKey==38) // Up 697 | { 698 | if (childIndex>0) 699 | { 700 | var newIndex = childIndex-1; 701 | document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); 702 | } 703 | else // already at first child, jump to parent 704 | { 705 | document.getElementById('Item'+itemIndex).focus(); 706 | } 707 | } 708 | else if (this.lastKey==40) // Down 709 | { 710 | var newIndex = childIndex+1; 711 | var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); 712 | if (!elem) // last child, jump to parent next parent 713 | { 714 | elem = this.NavNext(itemIndex+1); 715 | } 716 | if (elem) 717 | { 718 | elem.focus(); 719 | } 720 | } 721 | else if (this.lastKey==27) // Escape 722 | { 723 | parent.searchBox.CloseResultsWindow(); 724 | parent.document.getElementById("MSearchField").focus(); 725 | } 726 | else if (this.lastKey==13) // Enter 727 | { 728 | return true; 729 | } 730 | return false; 731 | } 732 | } 733 | -------------------------------------------------------------------------------- /html/search/search_l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/html/search/search_l.png -------------------------------------------------------------------------------- /html/search/search_m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/html/search/search_m.png -------------------------------------------------------------------------------- /html/search/search_r.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/html/search/search_r.png -------------------------------------------------------------------------------- /html/tab_a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/html/tab_a.png -------------------------------------------------------------------------------- /html/tab_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/html/tab_b.png -------------------------------------------------------------------------------- /html/tab_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/html/tab_h.png -------------------------------------------------------------------------------- /html/tab_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/html/tab_s.png -------------------------------------------------------------------------------- /html/tabs.css: -------------------------------------------------------------------------------- 1 | .tabs, .tabs2, .tabs3 { 2 | background-image: url('tab_b.png'); 3 | width: 100%; 4 | z-index: 101; 5 | font-size: 13px; 6 | } 7 | 8 | .tabs2 { 9 | font-size: 10px; 10 | } 11 | .tabs3 { 12 | font-size: 9px; 13 | } 14 | 15 | .tablist { 16 | margin: 0; 17 | padding: 0; 18 | display: table; 19 | } 20 | 21 | .tablist li { 22 | float: left; 23 | display: table-cell; 24 | background-image: url('tab_b.png'); 25 | line-height: 36px; 26 | list-style: none; 27 | } 28 | 29 | .tablist a { 30 | display: block; 31 | padding: 0 20px; 32 | font-weight: bold; 33 | background-image:url('tab_s.png'); 34 | background-repeat:no-repeat; 35 | background-position:right; 36 | color: #283A5D; 37 | text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); 38 | text-decoration: none; 39 | outline: none; 40 | } 41 | 42 | .tabs3 .tablist a { 43 | padding: 0 10px; 44 | } 45 | 46 | .tablist a:hover { 47 | background-image: url('tab_h.png'); 48 | background-repeat:repeat-x; 49 | color: #fff; 50 | text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); 51 | text-decoration: none; 52 | } 53 | 54 | .tablist li.current a { 55 | background-image: url('tab_a.png'); 56 | background-repeat:repeat-x; 57 | color: #fff; 58 | text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); 59 | } 60 | -------------------------------------------------------------------------------- /images/in-mem-loop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/images/in-mem-loop.png -------------------------------------------------------------------------------- /images/in-mem-snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/images/in-mem-snap.png -------------------------------------------------------------------------------- /latex/Makefile: -------------------------------------------------------------------------------- 1 | all: clean refman.pdf 2 | 3 | pdf: refman.pdf 4 | 5 | refman.pdf: refman.tex 6 | pdflatex refman.tex 7 | makeindex refman.idx 8 | pdflatex refman.tex 9 | latex_count=5 ; \ 10 | while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\ 11 | do \ 12 | echo "Rerunning latex...." ;\ 13 | pdflatex refman.tex ;\ 14 | latex_count=`expr $$latex_count - 1` ;\ 15 | done 16 | 17 | 18 | clean: 19 | rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out refman.pdf 20 | -------------------------------------------------------------------------------- /latex/doxygen.sty: -------------------------------------------------------------------------------- 1 | \NeedsTeXFormat{LaTeX2e} 2 | \ProvidesPackage{doxygen} 3 | 4 | % Packages used by this style file 5 | \RequirePackage{alltt} 6 | \RequirePackage{array} 7 | \RequirePackage{calc} 8 | \RequirePackage{color} 9 | \RequirePackage{fancyhdr} 10 | \RequirePackage{verbatim} 11 | 12 | % Setup fancy headings 13 | \pagestyle{fancyplain} 14 | \newcommand{\clearemptydoublepage}{% 15 | \newpage{\pagestyle{empty}\cleardoublepage}% 16 | } 17 | \renewcommand{\chaptermark}[1]{% 18 | \markboth{#1}{}% 19 | } 20 | \renewcommand{\sectionmark}[1]{% 21 | \markright{\thesection\ #1}% 22 | } 23 | \lhead[\fancyplain{}{\bfseries\thepage}]{% 24 | \fancyplain{}{\bfseries\rightmark}% 25 | } 26 | \rhead[\fancyplain{}{\bfseries\leftmark}]{% 27 | \fancyplain{}{\bfseries\thepage}% 28 | } 29 | \rfoot[\fancyplain{}{\bfseries\scriptsize% 30 | Generated on Tue Oct 25 2011 20:34:34 by Doxygen }]{} 31 | \lfoot[]{\fancyplain{}{\bfseries\scriptsize% 32 | Generated on Tue Oct 25 2011 20:34:34 by Doxygen }} 33 | \cfoot{} 34 | 35 | %---------- Internal commands used in this style file ---------------- 36 | 37 | % Generic environment used by all paragraph-based environments defined 38 | % below. Note that the command \title{...} needs to be defined inside 39 | % those environments! 40 | \newenvironment{DoxyDesc}[1]{% 41 | \begin{list}{}% 42 | {% 43 | \settowidth{\labelwidth}{40pt}% 44 | \setlength{\leftmargin}{\labelwidth}% 45 | \setlength{\parsep}{0pt}% 46 | \setlength{\itemsep}{-4pt}% 47 | \renewcommand{\makelabel}{\entrylabel}% 48 | }% 49 | \item[#1]% 50 | }{% 51 | \end{list}% 52 | } 53 | 54 | %---------- Commands used by doxygen LaTeX output generator ---------- 55 | 56 | % Used by
 ... 
57 | \newenvironment{DoxyPre}{% 58 | \small% 59 | \begin{alltt}% 60 | }{% 61 | \end{alltt}% 62 | \normalsize% 63 | } 64 | 65 | % Used by @code ... @endcode 66 | \newenvironment{DoxyCode}{% 67 | \footnotesize% 68 | \verbatim% 69 | }{% 70 | \endverbatim% 71 | \normalsize% 72 | } 73 | 74 | % Used by @example, @include, @includelineno and @dontinclude 75 | \newenvironment{DoxyCodeInclude}{% 76 | \DoxyCode% 77 | }{% 78 | \endDoxyCode% 79 | } 80 | 81 | % Used by @verbatim ... @endverbatim 82 | \newenvironment{DoxyVerb}{% 83 | \footnotesize% 84 | \verbatim% 85 | }{% 86 | \endverbatim% 87 | \normalsize% 88 | } 89 | 90 | % Used by @verbinclude 91 | \newenvironment{DoxyVerbInclude}{% 92 | \DoxyVerb% 93 | }{% 94 | \endDoxyVerb% 95 | } 96 | 97 | % Used by numbered lists (using '-#' or
    ...
) 98 | \newenvironment{DoxyEnumerate}{% 99 | \enumerate% 100 | }{% 101 | \endenumerate% 102 | } 103 | 104 | % Used by bullet lists (using '-', @li, @arg, or
    ...
) 105 | \newenvironment{DoxyItemize}{% 106 | \itemize% 107 | }{% 108 | \enditemize% 109 | } 110 | 111 | % Used by description lists (using
...
) 112 | \newenvironment{DoxyDescription}{% 113 | \description% 114 | }{% 115 | \enddescription% 116 | } 117 | 118 | % Used by @image, @dotfile, and @dot ... @enddot 119 | % (only if caption is specified) 120 | \newenvironment{DoxyImage}{% 121 | \begin{figure}[H]% 122 | \begin{center}% 123 | }{% 124 | \end{center}% 125 | \end{figure}% 126 | } 127 | 128 | % Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc 129 | % (only if no caption is specified) 130 | \newenvironment{DoxyImageNoCaption}{% 131 | }{% 132 | } 133 | 134 | % Used by @attention 135 | \newenvironment{DoxyAttention}[1]{% 136 | \begin{DoxyDesc}{#1}% 137 | }{% 138 | \end{DoxyDesc}% 139 | } 140 | 141 | % Used by @author and @authors 142 | \newenvironment{DoxyAuthor}[1]{% 143 | \begin{DoxyDesc}{#1}% 144 | }{% 145 | \end{DoxyDesc}% 146 | } 147 | 148 | % Used by @date 149 | \newenvironment{DoxyDate}[1]{% 150 | \begin{DoxyDesc}{#1}% 151 | }{% 152 | \end{DoxyDesc}% 153 | } 154 | 155 | % Used by @invariant 156 | \newenvironment{DoxyInvariant}[1]{% 157 | \begin{DoxyDesc}{#1}% 158 | }{% 159 | \end{DoxyDesc}% 160 | } 161 | 162 | % Used by @note 163 | \newenvironment{DoxyNote}[1]{% 164 | \begin{DoxyDesc}{#1}% 165 | }{% 166 | \end{DoxyDesc}% 167 | } 168 | 169 | % Used by @post 170 | \newenvironment{DoxyPostcond}[1]{% 171 | \begin{DoxyDesc}{#1}% 172 | }{% 173 | \end{DoxyDesc}% 174 | } 175 | 176 | % Used by @pre 177 | \newenvironment{DoxyPrecond}[1]{% 178 | \begin{DoxyDesc}{#1}% 179 | }{% 180 | \end{DoxyDesc}% 181 | } 182 | 183 | % Used by @remark 184 | \newenvironment{DoxyRemark}[1]{% 185 | \begin{DoxyDesc}{#1}% 186 | }{% 187 | \end{DoxyDesc}% 188 | } 189 | 190 | % Used by @return 191 | \newenvironment{DoxyReturn}[1]{% 192 | \begin{DoxyDesc}{#1}% 193 | }{% 194 | \end{DoxyDesc}% 195 | } 196 | 197 | % Used by @since 198 | \newenvironment{DoxySince}[1]{% 199 | \begin{DoxyDesc}{#1}% 200 | }{% 201 | \end{DoxyDesc}% 202 | } 203 | 204 | % Used by @see 205 | \newenvironment{DoxySeeAlso}[1]{% 206 | \begin{DoxyDesc}{#1}% 207 | }{% 208 | \end{DoxyDesc}% 209 | } 210 | 211 | % Used by @version 212 | \newenvironment{DoxyVersion}[1]{% 213 | \begin{DoxyDesc}{#1}% 214 | }{% 215 | \end{DoxyDesc}% 216 | } 217 | 218 | % Used by @warning 219 | \newenvironment{DoxyWarning}[1]{% 220 | \begin{DoxyDesc}{#1}% 221 | }{% 222 | \end{DoxyDesc}% 223 | } 224 | 225 | % Used by @internal 226 | \newenvironment{DoxyInternal}[1]{% 227 | \paragraph*{#1}% 228 | }{% 229 | } 230 | 231 | % Used by @par and @paragraph 232 | \newenvironment{DoxyParagraph}[1]{% 233 | \begin{list}{}% 234 | {% 235 | \settowidth{\labelwidth}{40pt}% 236 | \setlength{\leftmargin}{\labelwidth}% 237 | \setlength{\parsep}{0pt}% 238 | \setlength{\itemsep}{-4pt}% 239 | \renewcommand{\makelabel}{\entrylabel}% 240 | }% 241 | \item[#1]% 242 | }{% 243 | \end{list}% 244 | } 245 | 246 | % Used by parameter lists 247 | \newenvironment{DoxyParams}[1]{% 248 | \begin{DoxyDesc}{#1}% 249 | \begin{description}% 250 | }{% 251 | \end{description}% 252 | \end{DoxyDesc}% 253 | } 254 | 255 | % is used for parameters within a detailed function description 256 | \newenvironment{DoxyParamCaption}{% 257 | \renewcommand{\item}[2][]{##1 {\em ##2}}% 258 | }{% 259 | } 260 | 261 | % Used by return value lists 262 | \newenvironment{DoxyRetVals}[1]{% 263 | \begin{DoxyDesc}{#1}% 264 | \begin{description}% 265 | }{% 266 | \end{description}% 267 | \end{DoxyDesc}% 268 | } 269 | 270 | % Used by exception lists 271 | \newenvironment{DoxyExceptions}[1]{% 272 | \begin{DoxyDesc}{#1}% 273 | \begin{description}% 274 | }{% 275 | \end{description}% 276 | \end{DoxyDesc}% 277 | } 278 | 279 | % Used by template parameter lists 280 | \newenvironment{DoxyTemplParams}[1]{% 281 | \begin{DoxyDesc}{#1}% 282 | \begin{description}% 283 | }{% 284 | \end{description}% 285 | \end{DoxyDesc}% 286 | } 287 | 288 | \newcommand{\doxyref}[3]{\textbf{#1} (\textnormal{#2}\,\pageref{#3})} 289 | \newenvironment{DoxyCompactList} 290 | {\begin{list}{}{ 291 | \setlength{\leftmargin}{0.5cm} 292 | \setlength{\itemsep}{0pt} 293 | \setlength{\parsep}{0pt} 294 | \setlength{\topsep}{0pt} 295 | \renewcommand{\makelabel}{\hfill}}} 296 | {\end{list}} 297 | \newenvironment{DoxyCompactItemize} 298 | { 299 | \begin{itemize} 300 | \setlength{\itemsep}{-3pt} 301 | \setlength{\parsep}{0pt} 302 | \setlength{\topsep}{0pt} 303 | \setlength{\partopsep}{0pt} 304 | } 305 | {\end{itemize}} 306 | \newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp} 307 | \newlength{\tmplength} 308 | \newenvironment{TabularC}[1] 309 | { 310 | \setlength{\tmplength} 311 | {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)} 312 | \par\begin{tabular*}{\linewidth} 313 | {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|} 314 | } 315 | {\end{tabular*}\par} 316 | \newcommand{\entrylabel}[1]{ 317 | {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{\textbf{#1}}\vspace{1.5\baselineskip}}}} 318 | \newenvironment{Desc} 319 | {\begin{list}{} 320 | { 321 | \settowidth{\labelwidth}{40pt} 322 | \setlength{\leftmargin}{\labelwidth} 323 | \setlength{\parsep}{0pt} 324 | \setlength{\itemsep}{-4pt} 325 | \renewcommand{\makelabel}{\entrylabel} 326 | } 327 | } 328 | {\end{list}} 329 | \newenvironment{Indent} 330 | {\begin{list}{}{\setlength{\leftmargin}{0.5cm}} 331 | \item[]\ignorespaces} 332 | {\unskip\end{list}} 333 | \setlength{\parindent}{0cm} 334 | \setlength{\parskip}{0.2cm} 335 | \addtocounter{secnumdepth}{1} 336 | \sloppy 337 | \usepackage[T1]{fontenc} 338 | \makeatletter 339 | \renewcommand{\paragraph}{\@startsection{paragraph}{4}{0ex}% 340 | {-3.25ex plus -1ex minus -0.2ex}% 341 | {1.5ex plus 0.2ex}% 342 | {\normalfont\normalsize\bfseries}} 343 | \makeatother 344 | \stepcounter{secnumdepth} 345 | \stepcounter{tocdepth} 346 | \definecolor{comment}{rgb}{0.5,0.0,0.0} 347 | \definecolor{keyword}{rgb}{0.0,0.5,0.0} 348 | \definecolor{keywordtype}{rgb}{0.38,0.25,0.125} 349 | \definecolor{keywordflow}{rgb}{0.88,0.5,0.0} 350 | \definecolor{preprocessor}{rgb}{0.5,0.38,0.125} 351 | \definecolor{stringliteral}{rgb}{0.0,0.125,0.25} 352 | \definecolor{charliteral}{rgb}{0.0,0.5,0.5} 353 | \definecolor{vhdldigit}{rgb}{1.0,0.0,1.0} 354 | \definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43} 355 | \definecolor{vhdllogic}{rgb}{1.0,0.0,0.0} 356 | \definecolor{vhdlchar}{rgb}{0.0,0.0,0.0} 357 | -------------------------------------------------------------------------------- /latex/files.tex: -------------------------------------------------------------------------------- 1 | \section{File List} 2 | Here is a list of all files with brief descriptions:\begin{DoxyCompactList} 3 | \item\contentsline{section}{\hyperlink{gdb__utils_8py}{gdb\_\-utils.py} }{\pageref{gdb__utils_8py}}{} 4 | \end{DoxyCompactList} 5 | -------------------------------------------------------------------------------- /latex/gdb__utils_8py.tex: -------------------------------------------------------------------------------- 1 | \hypertarget{gdb__utils_8py}{ 2 | \section{gdb\_\-utils.py File Reference} 3 | \label{gdb__utils_8py}\index{gdb\_\-utils.py@{gdb\_\-utils.py}} 4 | } 5 | \subsection*{Namespaces} 6 | \begin{DoxyCompactItemize} 7 | \item 8 | namespace \hyperlink{namespacegdb__utils}{gdb\_\-utils} 9 | 10 | 11 | \begin{DoxyCompactList}\small\item\em Various utility functions to work with GDB. \item\end{DoxyCompactList} 12 | 13 | \end{DoxyCompactItemize} 14 | \subsection*{Functions} 15 | \begin{DoxyCompactItemize} 16 | \item 17 | def \hyperlink{namespacegdb__utils_a45c469a5d115a84fc5be337a498d53e8}{gdb\_\-utils::read\_\-string} 18 | \begin{DoxyCompactList}\small\item\em Read an ASCII string from memory. \item\end{DoxyCompactList}\item 19 | def \hyperlink{namespacegdb__utils_ac02efa9be19432d56d87e0e8449a01b8}{gdb\_\-utils::execute\_\-output} 20 | \begin{DoxyCompactList}\small\item\em Execute a GDB command with output capture. \item\end{DoxyCompactList}\item 21 | def \hyperlink{namespacegdb__utils_a66a2a66bb422efdc0bb1e70d0c2b7bdb}{gdb\_\-utils::execute\_\-external} 22 | \begin{DoxyCompactList}\small\item\em Execute external command. \item\end{DoxyCompactList}\item 23 | def \hyperlink{namespacegdb__utils_a7d52a77166676bd83335c267ad476ceb}{gdb\_\-utils::execute\_\-external\_\-output} 24 | \begin{DoxyCompactList}\small\item\em Execute external command with output capture. \item\end{DoxyCompactList}\item 25 | def \hyperlink{namespacegdb__utils_a5fe1761fbd0a4c2b9f707c2dfad64575}{gdb\_\-utils::search\_\-functions} 26 | \begin{DoxyCompactList}\small\item\em Search program functions and return their names and addresses. \item\end{DoxyCompactList}\item 27 | def \hyperlink{namespacegdb__utils_acd7370f13df479c88d906e889b689da5}{gdb\_\-utils::search\_\-processes} 28 | \begin{DoxyCompactList}\small\item\em Search running processes and return their info. \item\end{DoxyCompactList}\item 29 | def \hyperlink{namespacegdb__utils_a26847c0237df4c93c1a9730fff176ebb}{gdb\_\-utils::parse\_\-disassembled\_\-output} 30 | \begin{DoxyCompactList}\small\item\em Parse disassebled output (internal function). \item\end{DoxyCompactList}\item 31 | def \hyperlink{namespacegdb__utils_a53631beb2f9fbc513f91f518c8a14909}{gdb\_\-utils::disassemble\_\-function} 32 | \begin{DoxyCompactList}\small\item\em Disassemble a function. \item\end{DoxyCompactList}\item 33 | def \hyperlink{namespacegdb__utils_afef6275f9b3c7c8ade8b5d480bb8cfa8}{gdb\_\-utils::disassemble\_\-range} 34 | \begin{DoxyCompactList}\small\item\em Disassemble a range. \item\end{DoxyCompactList}\item 35 | def \hyperlink{namespacegdb__utils_ab1c43cdcaef7773455846cde28072195}{gdb\_\-utils::disassemble\_\-count} 36 | \begin{DoxyCompactList}\small\item\em Disassemble a variable number of instruction. \item\end{DoxyCompactList}\item 37 | def \hyperlink{namespacegdb__utils_a582cf34912aa2a254db0f09439217952}{gdb\_\-utils::disassemble\_\-current\_\-instruction} 38 | \begin{DoxyCompactList}\small\item\em Disassemble and return the current instruction (pointed by the program counter register). \item\end{DoxyCompactList}\item 39 | def \hyperlink{namespacegdb__utils_a06ba6fed35ce3e4c302ddda2538dfee2}{gdb\_\-utils::disassemble\_\-current\_\-instructions} 40 | \begin{DoxyCompactList}\small\item\em Disassemble a variable number of instruction starting from the current instruction (pointed by the program counter register). \item\end{DoxyCompactList}\item 41 | def \hyperlink{namespacegdb__utils_a3f10b77a8290241190153a5f108a1350}{gdb\_\-utils::process\_\-mappings} 42 | \begin{DoxyCompactList}\small\item\em Get process memory mapping. \item\end{DoxyCompactList}\item 43 | def \hyperlink{namespacegdb__utils_a54cbc3d1cad96ff0ce29a568d7e7f4b9}{gdb\_\-utils::assemble\_\-instructions} 44 | \begin{DoxyCompactList}\small\item\em Assemble x86/x64 assembly instructions and return a buffer containing the assembled machine code. \item\end{DoxyCompactList}\item 45 | def \hyperlink{namespacegdb__utils_a8d529e9b58dc60b73aab4facf0f65481}{gdb\_\-utils::normalized\_\-argv} 46 | \begin{DoxyCompactList}\small\item\em Get the normalized system arguments to fix a little (IMHO) gdb bug: when the program is executed with no arguments sys.argv is equal to \mbox{[}''\mbox{]}, in this case the function returns \mbox{[}\mbox{]}, otherwise returns sys.argv immutated. \item\end{DoxyCompactList}\end{DoxyCompactItemize} 47 | -------------------------------------------------------------------------------- /latex/namespacegdb__utils.tex: -------------------------------------------------------------------------------- 1 | \hypertarget{namespacegdb__utils}{ 2 | \section{gdb\_\-utils Namespace Reference} 3 | \label{namespacegdb__utils}\index{gdb\_\-utils@{gdb\_\-utils}} 4 | } 5 | 6 | 7 | Various utility functions to work with GDB. 8 | 9 | 10 | \subsection*{Functions} 11 | \begin{DoxyCompactItemize} 12 | \item 13 | def \hyperlink{namespacegdb__utils_a45c469a5d115a84fc5be337a498d53e8}{read\_\-string} 14 | \begin{DoxyCompactList}\small\item\em Read an ASCII string from memory. \item\end{DoxyCompactList}\item 15 | def \hyperlink{namespacegdb__utils_ac02efa9be19432d56d87e0e8449a01b8}{execute\_\-output} 16 | \begin{DoxyCompactList}\small\item\em Execute a GDB command with output capture. \item\end{DoxyCompactList}\item 17 | def \hyperlink{namespacegdb__utils_a66a2a66bb422efdc0bb1e70d0c2b7bdb}{execute\_\-external} 18 | \begin{DoxyCompactList}\small\item\em Execute external command. \item\end{DoxyCompactList}\item 19 | def \hyperlink{namespacegdb__utils_a7d52a77166676bd83335c267ad476ceb}{execute\_\-external\_\-output} 20 | \begin{DoxyCompactList}\small\item\em Execute external command with output capture. \item\end{DoxyCompactList}\item 21 | def \hyperlink{namespacegdb__utils_a5fe1761fbd0a4c2b9f707c2dfad64575}{search\_\-functions} 22 | \begin{DoxyCompactList}\small\item\em Search program functions and return their names and addresses. \item\end{DoxyCompactList}\item 23 | def \hyperlink{namespacegdb__utils_acd7370f13df479c88d906e889b689da5}{search\_\-processes} 24 | \begin{DoxyCompactList}\small\item\em Search running processes and return their info. \item\end{DoxyCompactList}\item 25 | def \hyperlink{namespacegdb__utils_a26847c0237df4c93c1a9730fff176ebb}{parse\_\-disassembled\_\-output} 26 | \begin{DoxyCompactList}\small\item\em Parse disassebled output (internal function). \item\end{DoxyCompactList}\item 27 | def \hyperlink{namespacegdb__utils_a53631beb2f9fbc513f91f518c8a14909}{disassemble\_\-function} 28 | \begin{DoxyCompactList}\small\item\em Disassemble a function. \item\end{DoxyCompactList}\item 29 | def \hyperlink{namespacegdb__utils_afef6275f9b3c7c8ade8b5d480bb8cfa8}{disassemble\_\-range} 30 | \begin{DoxyCompactList}\small\item\em Disassemble a range. \item\end{DoxyCompactList}\item 31 | def \hyperlink{namespacegdb__utils_ab1c43cdcaef7773455846cde28072195}{disassemble\_\-count} 32 | \begin{DoxyCompactList}\small\item\em Disassemble a variable number of instruction. \item\end{DoxyCompactList}\item 33 | def \hyperlink{namespacegdb__utils_a582cf34912aa2a254db0f09439217952}{disassemble\_\-current\_\-instruction} 34 | \begin{DoxyCompactList}\small\item\em Disassemble and return the current instruction (pointed by the program counter register). \item\end{DoxyCompactList}\item 35 | def \hyperlink{namespacegdb__utils_a06ba6fed35ce3e4c302ddda2538dfee2}{disassemble\_\-current\_\-instructions} 36 | \begin{DoxyCompactList}\small\item\em Disassemble a variable number of instruction starting from the current instruction (pointed by the program counter register). \item\end{DoxyCompactList}\item 37 | def \hyperlink{namespacegdb__utils_a3f10b77a8290241190153a5f108a1350}{process\_\-mappings} 38 | \begin{DoxyCompactList}\small\item\em Get process memory mapping. \item\end{DoxyCompactList}\item 39 | def \hyperlink{namespacegdb__utils_a54cbc3d1cad96ff0ce29a568d7e7f4b9}{assemble\_\-instructions} 40 | \begin{DoxyCompactList}\small\item\em Assemble x86/x64 assembly instructions and return a buffer containing the assembled machine code. \item\end{DoxyCompactList}\item 41 | def \hyperlink{namespacegdb__utils_a8d529e9b58dc60b73aab4facf0f65481}{normalized\_\-argv} 42 | \begin{DoxyCompactList}\small\item\em Get the normalized system arguments to fix a little (IMHO) gdb bug: when the program is executed with no arguments sys.argv is equal to \mbox{[}''\mbox{]}, in this case the function returns \mbox{[}\mbox{]}, otherwise returns sys.argv immutated. \item\end{DoxyCompactList}\end{DoxyCompactItemize} 43 | 44 | 45 | \subsection{Detailed Description} 46 | Various utility functions to work with GDB. This package provides functions not included in the default gdb module. 47 | 48 | \subsection{Function Documentation} 49 | \hypertarget{namespacegdb__utils_a54cbc3d1cad96ff0ce29a568d7e7f4b9}{ 50 | \index{gdb\_\-utils@{gdb\_\-utils}!assemble\_\-instructions@{assemble\_\-instructions}} 51 | \index{assemble\_\-instructions@{assemble\_\-instructions}!gdb_utils@{gdb\_\-utils}} 52 | \subsubsection[{assemble\_\-instructions}]{\setlength{\rightskip}{0pt plus 5cm}def gdb\_\-utils::assemble\_\-instructions ( 53 | \begin{DoxyParamCaption} 54 | \item[{}]{ instructions} 55 | \end{DoxyParamCaption} 56 | )}} 57 | \label{namespacegdb__utils_a54cbc3d1cad96ff0ce29a568d7e7f4b9} 58 | 59 | 60 | Assemble x86/x64 assembly instructions and return a buffer containing the assembled machine code. 61 | 62 | 63 | \begin{DoxyParams}{Parameters} 64 | \item[{\em instructions}](str) assembly instructions separated by a newline (basically an assembly listing)\end{DoxyParams} 65 | \begin{DoxyReturn}{Returns} 66 | a buffer containing the assembled machine code 67 | \end{DoxyReturn} 68 | \hypertarget{namespacegdb__utils_ab1c43cdcaef7773455846cde28072195}{ 69 | \index{gdb\_\-utils@{gdb\_\-utils}!disassemble\_\-count@{disassemble\_\-count}} 70 | \index{disassemble\_\-count@{disassemble\_\-count}!gdb_utils@{gdb\_\-utils}} 71 | \subsubsection[{disassemble\_\-count}]{\setlength{\rightskip}{0pt plus 5cm}def gdb\_\-utils::disassemble\_\-count ( 72 | \begin{DoxyParamCaption} 73 | \item[{}]{ start, } 74 | \item[{}]{ count, } 75 | \item[{}]{ regex = {\ttfamily ''}} 76 | \end{DoxyParamCaption} 77 | )}} 78 | \label{namespacegdb__utils_ab1c43cdcaef7773455846cde28072195} 79 | 80 | 81 | Disassemble a variable number of instruction. 82 | 83 | 84 | \begin{DoxyParams}{Parameters} 85 | \item[{\em start}](int) start address \item[{\em count}](int) total number of instructions to disassemble \item[{\em regex}](str) optional regular expression applied to the instruction mnemonic\end{DoxyParams} 86 | \begin{DoxyReturn}{Returns} 87 | list of instructions represented by a dictionary address-\/$>$instr\_\-code 88 | \end{DoxyReturn} 89 | \hypertarget{namespacegdb__utils_a582cf34912aa2a254db0f09439217952}{ 90 | \index{gdb\_\-utils@{gdb\_\-utils}!disassemble\_\-current\_\-instruction@{disassemble\_\-current\_\-instruction}} 91 | \index{disassemble\_\-current\_\-instruction@{disassemble\_\-current\_\-instruction}!gdb_utils@{gdb\_\-utils}} 92 | \subsubsection[{disassemble\_\-current\_\-instruction}]{\setlength{\rightskip}{0pt plus 5cm}def gdb\_\-utils::disassemble\_\-current\_\-instruction ( 93 | \begin{DoxyParamCaption} 94 | \item[{}]{ regex = {\ttfamily ''}} 95 | \end{DoxyParamCaption} 96 | )}} 97 | \label{namespacegdb__utils_a582cf34912aa2a254db0f09439217952} 98 | 99 | 100 | Disassemble and return the current instruction (pointed by the program counter register). 101 | 102 | 103 | \begin{DoxyParams}{Parameters} 104 | \item[{\em regex}](str) optional regular expression applied to the instruction mnemonic\end{DoxyParams} 105 | \begin{DoxyReturn}{Returns} 106 | the current instruction represented by a dictionary address-\/$>$instr\_\-code 107 | \end{DoxyReturn} 108 | \hypertarget{namespacegdb__utils_a06ba6fed35ce3e4c302ddda2538dfee2}{ 109 | \index{gdb\_\-utils@{gdb\_\-utils}!disassemble\_\-current\_\-instructions@{disassemble\_\-current\_\-instructions}} 110 | \index{disassemble\_\-current\_\-instructions@{disassemble\_\-current\_\-instructions}!gdb_utils@{gdb\_\-utils}} 111 | \subsubsection[{disassemble\_\-current\_\-instructions}]{\setlength{\rightskip}{0pt plus 5cm}def gdb\_\-utils::disassemble\_\-current\_\-instructions ( 112 | \begin{DoxyParamCaption} 113 | \item[{}]{ count, } 114 | \item[{}]{ regex = {\ttfamily ''}} 115 | \end{DoxyParamCaption} 116 | )}} 117 | \label{namespacegdb__utils_a06ba6fed35ce3e4c302ddda2538dfee2} 118 | 119 | 120 | Disassemble a variable number of instruction starting from the current instruction (pointed by the program counter register). 121 | 122 | 123 | \begin{DoxyParams}{Parameters} 124 | \item[{\em count}](int) total number of instructions to disassemble \item[{\em regex}](str) optional regular expression applied to the instruction mnemonic\end{DoxyParams} 125 | \begin{DoxyReturn}{Returns} 126 | list of instructions represented by a dictionary address-\/$>$instr\_\-code 127 | \end{DoxyReturn} 128 | \hypertarget{namespacegdb__utils_a53631beb2f9fbc513f91f518c8a14909}{ 129 | \index{gdb\_\-utils@{gdb\_\-utils}!disassemble\_\-function@{disassemble\_\-function}} 130 | \index{disassemble\_\-function@{disassemble\_\-function}!gdb_utils@{gdb\_\-utils}} 131 | \subsubsection[{disassemble\_\-function}]{\setlength{\rightskip}{0pt plus 5cm}def gdb\_\-utils::disassemble\_\-function ( 132 | \begin{DoxyParamCaption} 133 | \item[{}]{ func\_\-name, } 134 | \item[{}]{ regex = {\ttfamily ''}} 135 | \end{DoxyParamCaption} 136 | )}} 137 | \label{namespacegdb__utils_a53631beb2f9fbc513f91f518c8a14909} 138 | 139 | 140 | Disassemble a function. 141 | 142 | 143 | \begin{DoxyParams}{Parameters} 144 | \item[{\em func\_\-name}](str) name of the function to disassemble \item[{\em regex}](str) optional regular expression applied to the instruction mnemonic\end{DoxyParams} 145 | \begin{DoxyReturn}{Returns} 146 | list of instructions represented by a dictionary address-\/$>$instr\_\-code 147 | \end{DoxyReturn} 148 | \hypertarget{namespacegdb__utils_afef6275f9b3c7c8ade8b5d480bb8cfa8}{ 149 | \index{gdb\_\-utils@{gdb\_\-utils}!disassemble\_\-range@{disassemble\_\-range}} 150 | \index{disassemble\_\-range@{disassemble\_\-range}!gdb_utils@{gdb\_\-utils}} 151 | \subsubsection[{disassemble\_\-range}]{\setlength{\rightskip}{0pt plus 5cm}def gdb\_\-utils::disassemble\_\-range ( 152 | \begin{DoxyParamCaption} 153 | \item[{}]{ start, } 154 | \item[{}]{ end, } 155 | \item[{}]{ regex = {\ttfamily ''}} 156 | \end{DoxyParamCaption} 157 | )}} 158 | \label{namespacegdb__utils_afef6275f9b3c7c8ade8b5d480bb8cfa8} 159 | 160 | 161 | Disassemble a range. 162 | 163 | 164 | \begin{DoxyParams}{Parameters} 165 | \item[{\em start}](int) start address \item[{\em end}](int) end address \item[{\em regex}](str) optional regular expression applied to the instruction mnemonic\end{DoxyParams} 166 | \begin{DoxyReturn}{Returns} 167 | list of instructions represented by a dictionary address-\/$>$instr\_\-code 168 | \end{DoxyReturn} 169 | \hypertarget{namespacegdb__utils_a66a2a66bb422efdc0bb1e70d0c2b7bdb}{ 170 | \index{gdb\_\-utils@{gdb\_\-utils}!execute\_\-external@{execute\_\-external}} 171 | \index{execute\_\-external@{execute\_\-external}!gdb_utils@{gdb\_\-utils}} 172 | \subsubsection[{execute\_\-external}]{\setlength{\rightskip}{0pt plus 5cm}def gdb\_\-utils::execute\_\-external ( 173 | \begin{DoxyParamCaption} 174 | \item[{}]{ command} 175 | \end{DoxyParamCaption} 176 | )}} 177 | \label{namespacegdb__utils_a66a2a66bb422efdc0bb1e70d0c2b7bdb} 178 | 179 | 180 | Execute external command. 181 | 182 | 183 | \begin{DoxyParams}{Parameters} 184 | \item[{\em command}](str) command string to execute (command + arguments) \end{DoxyParams} 185 | \hypertarget{namespacegdb__utils_a7d52a77166676bd83335c267ad476ceb}{ 186 | \index{gdb\_\-utils@{gdb\_\-utils}!execute\_\-external\_\-output@{execute\_\-external\_\-output}} 187 | \index{execute\_\-external\_\-output@{execute\_\-external\_\-output}!gdb_utils@{gdb\_\-utils}} 188 | \subsubsection[{execute\_\-external\_\-output}]{\setlength{\rightskip}{0pt plus 5cm}def gdb\_\-utils::execute\_\-external\_\-output ( 189 | \begin{DoxyParamCaption} 190 | \item[{}]{ command} 191 | \end{DoxyParamCaption} 192 | )}} 193 | \label{namespacegdb__utils_a7d52a77166676bd83335c267ad476ceb} 194 | 195 | 196 | Execute external command with output capture. 197 | 198 | 199 | \begin{DoxyParams}{Parameters} 200 | \item[{\em command}](str) command string to execute (command + arguments)\end{DoxyParams} 201 | \begin{DoxyReturn}{Returns} 202 | command output as list of strings 203 | \end{DoxyReturn} 204 | \hypertarget{namespacegdb__utils_ac02efa9be19432d56d87e0e8449a01b8}{ 205 | \index{gdb\_\-utils@{gdb\_\-utils}!execute\_\-output@{execute\_\-output}} 206 | \index{execute\_\-output@{execute\_\-output}!gdb_utils@{gdb\_\-utils}} 207 | \subsubsection[{execute\_\-output}]{\setlength{\rightskip}{0pt plus 5cm}def gdb\_\-utils::execute\_\-output ( 208 | \begin{DoxyParamCaption} 209 | \item[{}]{ command} 210 | \end{DoxyParamCaption} 211 | )}} 212 | \label{namespacegdb__utils_ac02efa9be19432d56d87e0e8449a01b8} 213 | 214 | 215 | Execute a GDB command with output capture. 216 | 217 | 218 | \begin{DoxyParams}{Parameters} 219 | \item[{\em command}](str) GDB command\end{DoxyParams} 220 | \begin{DoxyReturn}{Returns} 221 | command output (str) 222 | \end{DoxyReturn} 223 | \hypertarget{namespacegdb__utils_a8d529e9b58dc60b73aab4facf0f65481}{ 224 | \index{gdb\_\-utils@{gdb\_\-utils}!normalized\_\-argv@{normalized\_\-argv}} 225 | \index{normalized\_\-argv@{normalized\_\-argv}!gdb_utils@{gdb\_\-utils}} 226 | \subsubsection[{normalized\_\-argv}]{\setlength{\rightskip}{0pt plus 5cm}def gdb\_\-utils::normalized\_\-argv ( 227 | \begin{DoxyParamCaption} 228 | {} 229 | \end{DoxyParamCaption} 230 | )}} 231 | \label{namespacegdb__utils_a8d529e9b58dc60b73aab4facf0f65481} 232 | 233 | 234 | Get the normalized system arguments to fix a little (IMHO) gdb bug: when the program is executed with no arguments sys.argv is equal to \mbox{[}''\mbox{]}, in this case the function returns \mbox{[}\mbox{]}, otherwise returns sys.argv immutated. 235 | 236 | \begin{DoxyReturn}{Returns} 237 | the normalized system arguments 238 | \end{DoxyReturn} 239 | \hypertarget{namespacegdb__utils_a26847c0237df4c93c1a9730fff176ebb}{ 240 | \index{gdb\_\-utils@{gdb\_\-utils}!parse\_\-disassembled\_\-output@{parse\_\-disassembled\_\-output}} 241 | \index{parse\_\-disassembled\_\-output@{parse\_\-disassembled\_\-output}!gdb_utils@{gdb\_\-utils}} 242 | \subsubsection[{parse\_\-disassembled\_\-output}]{\setlength{\rightskip}{0pt plus 5cm}def gdb\_\-utils::parse\_\-disassembled\_\-output ( 243 | \begin{DoxyParamCaption} 244 | \item[{}]{ output, } 245 | \item[{}]{ regex = {\ttfamily ''}} 246 | \end{DoxyParamCaption} 247 | )}} 248 | \label{namespacegdb__utils_a26847c0237df4c93c1a9730fff176ebb} 249 | 250 | 251 | Parse disassebled output (internal function). 252 | 253 | 254 | \begin{DoxyParams}{Parameters} 255 | \item[{\em output}](list of strings) disassembled output \item[{\em regex}](str) optional regular expression applied to the instruction mnemonic\end{DoxyParams} 256 | \begin{DoxyReturn}{Returns} 257 | list of instructions represented by a dictionary address-\/$>$instr\_\-code 258 | \end{DoxyReturn} 259 | \hypertarget{namespacegdb__utils_a3f10b77a8290241190153a5f108a1350}{ 260 | \index{gdb\_\-utils@{gdb\_\-utils}!process\_\-mappings@{process\_\-mappings}} 261 | \index{process\_\-mappings@{process\_\-mappings}!gdb_utils@{gdb\_\-utils}} 262 | \subsubsection[{process\_\-mappings}]{\setlength{\rightskip}{0pt plus 5cm}def gdb\_\-utils::process\_\-mappings ( 263 | \begin{DoxyParamCaption} 264 | \item[{}]{ regex = {\ttfamily ''}} 265 | \end{DoxyParamCaption} 266 | )}} 267 | \label{namespacegdb__utils_a3f10b77a8290241190153a5f108a1350} 268 | 269 | 270 | Get process memory mapping. 271 | 272 | 273 | \begin{DoxyParams}{Parameters} 274 | \item[{\em regex}](str) optional regular expression applied name of the memory area\end{DoxyParams} 275 | \begin{DoxyReturn}{Returns} 276 | a list of hash maps, where every hash map contains informations about a memory area 277 | \end{DoxyReturn} 278 | \hypertarget{namespacegdb__utils_a45c469a5d115a84fc5be337a498d53e8}{ 279 | \index{gdb\_\-utils@{gdb\_\-utils}!read\_\-string@{read\_\-string}} 280 | \index{read\_\-string@{read\_\-string}!gdb_utils@{gdb\_\-utils}} 281 | \subsubsection[{read\_\-string}]{\setlength{\rightskip}{0pt plus 5cm}def gdb\_\-utils::read\_\-string ( 282 | \begin{DoxyParamCaption} 283 | \item[{}]{ address, } 284 | \item[{}]{ count} 285 | \end{DoxyParamCaption} 286 | )}} 287 | \label{namespacegdb__utils_a45c469a5d115a84fc5be337a498d53e8} 288 | 289 | 290 | Read an ASCII string from memory. 291 | 292 | 293 | \begin{DoxyParams}{Parameters} 294 | \item[{\em address}](int) memory address of the string \item[{\em count}](int) maximum string length\end{DoxyParams} 295 | \begin{DoxyReturn}{Returns} 296 | string read (str) 297 | \end{DoxyReturn} 298 | \hypertarget{namespacegdb__utils_a5fe1761fbd0a4c2b9f707c2dfad64575}{ 299 | \index{gdb\_\-utils@{gdb\_\-utils}!search\_\-functions@{search\_\-functions}} 300 | \index{search\_\-functions@{search\_\-functions}!gdb_utils@{gdb\_\-utils}} 301 | \subsubsection[{search\_\-functions}]{\setlength{\rightskip}{0pt plus 5cm}def gdb\_\-utils::search\_\-functions ( 302 | \begin{DoxyParamCaption} 303 | \item[{}]{ regex = {\ttfamily ''}} 304 | \end{DoxyParamCaption} 305 | )}} 306 | \label{namespacegdb__utils_a5fe1761fbd0a4c2b9f707c2dfad64575} 307 | 308 | 309 | Search program functions and return their names and addresses. 310 | 311 | 312 | \begin{DoxyParams}{Parameters} 313 | \item[{\em regex}](str) optional regular expression to search for specific functions\end{DoxyParams} 314 | \begin{DoxyReturn}{Returns} 315 | dictionary of the type func\_\-name-\/$>$address 316 | \end{DoxyReturn} 317 | \hypertarget{namespacegdb__utils_acd7370f13df479c88d906e889b689da5}{ 318 | \index{gdb\_\-utils@{gdb\_\-utils}!search\_\-processes@{search\_\-processes}} 319 | \index{search\_\-processes@{search\_\-processes}!gdb_utils@{gdb\_\-utils}} 320 | \subsubsection[{search\_\-processes}]{\setlength{\rightskip}{0pt plus 5cm}def gdb\_\-utils::search\_\-processes ( 321 | \begin{DoxyParamCaption} 322 | \item[{}]{ regex = {\ttfamily ''}} 323 | \end{DoxyParamCaption} 324 | )}} 325 | \label{namespacegdb__utils_acd7370f13df479c88d906e889b689da5} 326 | 327 | 328 | Search running processes and return their info. 329 | 330 | 331 | \begin{DoxyParams}{Parameters} 332 | \item[{\em regex}](str) optional regular expression applied to the process name\end{DoxyParams} 333 | \begin{DoxyReturn}{Returns} 334 | a list of hash maps, where every hash map contains informations about a process 335 | \end{DoxyReturn} 336 | -------------------------------------------------------------------------------- /latex/namespaces.tex: -------------------------------------------------------------------------------- 1 | \section{Namespace List} 2 | Here is a list of all namespaces with brief descriptions:\begin{DoxyCompactList} 3 | \item\contentsline{section}{\hyperlink{namespacegdb__utils}{gdb\_\-utils} (Various utility functions to work with GDB )}{\pageref{namespacegdb__utils}}{} 4 | \end{DoxyCompactList} 5 | -------------------------------------------------------------------------------- /latex/refman.aux: -------------------------------------------------------------------------------- 1 | \relax 2 | \ifx\hyper@anchor\@undefined 3 | \global \let \oldcontentsline\contentsline 4 | \gdef \contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} 5 | \global \let \oldnewlabel\newlabel 6 | \gdef \newlabel#1#2{\newlabelxx{#1}#2} 7 | \gdef \newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} 8 | \AtEndDocument{\let \contentsline\oldcontentsline 9 | \let \newlabel\oldnewlabel} 10 | \else 11 | \global \let \hyper@last\relax 12 | \fi 13 | 14 | \@writefile{toc}{\contentsline {chapter}{\numberline {1}Namespace Index}{1}{chapter.1}} 15 | \@writefile{lof}{\addvspace {10\p@ }} 16 | \@writefile{lot}{\addvspace {10\p@ }} 17 | \@writefile{toc}{\contentsline {section}{\numberline {1.1}Namespace List}{1}{section.1.1}} 18 | \@writefile{toc}{\contentsline {chapter}{\numberline {2}File Index}{3}{chapter.2}} 19 | \@writefile{lof}{\addvspace {10\p@ }} 20 | \@writefile{lot}{\addvspace {10\p@ }} 21 | \@writefile{toc}{\contentsline {section}{\numberline {2.1}File List}{3}{section.2.1}} 22 | \@writefile{toc}{\contentsline {chapter}{\numberline {3}Namespace Documentation}{5}{chapter.3}} 23 | \@writefile{lof}{\addvspace {10\p@ }} 24 | \@writefile{lot}{\addvspace {10\p@ }} 25 | \@writefile{toc}{\contentsline {section}{\numberline {3.1}gdb\_\discretionary {-}{}{}utils Namespace Reference}{5}{section.3.1}} 26 | \newlabel{namespacegdb__utils}{{3.1}{5}{gdb\_\-utils Namespace Reference\relax }{section.3.1}{}} 27 | \@writefile{toc}{\contentsline {subsection}{\numberline {3.1.1}Detailed Description}{6}{subsection.3.1.1}} 28 | \@writefile{toc}{\contentsline {subsection}{\numberline {3.1.2}Function Documentation}{6}{subsection.3.1.2}} 29 | \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.1}assemble\_\discretionary {-}{}{}instructions}{6}{subsubsection.3.1.2.1}} 30 | \newlabel{namespacegdb__utils_a54cbc3d1cad96ff0ce29a568d7e7f4b9}{{3.1.2.1}{6}{assemble\_\-instructions\relax }{subsubsection.3.1.2.1}{}} 31 | \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.2}disassemble\_\discretionary {-}{}{}count}{6}{subsubsection.3.1.2.2}} 32 | \newlabel{namespacegdb__utils_ab1c43cdcaef7773455846cde28072195}{{3.1.2.2}{6}{disassemble\_\-count\relax }{subsubsection.3.1.2.2}{}} 33 | \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.3}disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instruction}{7}{subsubsection.3.1.2.3}} 34 | \newlabel{namespacegdb__utils_a582cf34912aa2a254db0f09439217952}{{3.1.2.3}{7}{disassemble\_\-current\_\-instruction\relax }{subsubsection.3.1.2.3}{}} 35 | \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.4}disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instructions}{7}{subsubsection.3.1.2.4}} 36 | \newlabel{namespacegdb__utils_a06ba6fed35ce3e4c302ddda2538dfee2}{{3.1.2.4}{7}{disassemble\_\-current\_\-instructions\relax }{subsubsection.3.1.2.4}{}} 37 | \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.5}disassemble\_\discretionary {-}{}{}function}{7}{subsubsection.3.1.2.5}} 38 | \newlabel{namespacegdb__utils_a53631beb2f9fbc513f91f518c8a14909}{{3.1.2.5}{7}{disassemble\_\-function\relax }{subsubsection.3.1.2.5}{}} 39 | \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.6}disassemble\_\discretionary {-}{}{}range}{7}{subsubsection.3.1.2.6}} 40 | \newlabel{namespacegdb__utils_afef6275f9b3c7c8ade8b5d480bb8cfa8}{{3.1.2.6}{7}{disassemble\_\-range\relax }{subsubsection.3.1.2.6}{}} 41 | \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.7}execute\_\discretionary {-}{}{}external}{8}{subsubsection.3.1.2.7}} 42 | \newlabel{namespacegdb__utils_a66a2a66bb422efdc0bb1e70d0c2b7bdb}{{3.1.2.7}{8}{execute\_\-external\relax }{subsubsection.3.1.2.7}{}} 43 | \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.8}execute\_\discretionary {-}{}{}external\_\discretionary {-}{}{}output}{8}{subsubsection.3.1.2.8}} 44 | \newlabel{namespacegdb__utils_a7d52a77166676bd83335c267ad476ceb}{{3.1.2.8}{8}{execute\_\-external\_\-output\relax }{subsubsection.3.1.2.8}{}} 45 | \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.9}execute\_\discretionary {-}{}{}output}{8}{subsubsection.3.1.2.9}} 46 | \newlabel{namespacegdb__utils_ac02efa9be19432d56d87e0e8449a01b8}{{3.1.2.9}{8}{execute\_\-output\relax }{subsubsection.3.1.2.9}{}} 47 | \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.10}normalized\_\discretionary {-}{}{}argv}{8}{subsubsection.3.1.2.10}} 48 | \newlabel{namespacegdb__utils_a8d529e9b58dc60b73aab4facf0f65481}{{3.1.2.10}{8}{normalized\_\-argv\relax }{subsubsection.3.1.2.10}{}} 49 | \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.11}parse\_\discretionary {-}{}{}disassembled\_\discretionary {-}{}{}output}{8}{subsubsection.3.1.2.11}} 50 | \newlabel{namespacegdb__utils_a26847c0237df4c93c1a9730fff176ebb}{{3.1.2.11}{8}{parse\_\-disassembled\_\-output\relax }{subsubsection.3.1.2.11}{}} 51 | \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.12}process\_\discretionary {-}{}{}mappings}{9}{subsubsection.3.1.2.12}} 52 | \newlabel{namespacegdb__utils_a3f10b77a8290241190153a5f108a1350}{{3.1.2.12}{9}{process\_\-mappings\relax }{subsubsection.3.1.2.12}{}} 53 | \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.13}read\_\discretionary {-}{}{}string}{9}{subsubsection.3.1.2.13}} 54 | \newlabel{namespacegdb__utils_a45c469a5d115a84fc5be337a498d53e8}{{3.1.2.13}{9}{read\_\-string\relax }{subsubsection.3.1.2.13}{}} 55 | \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.14}search\_\discretionary {-}{}{}functions}{9}{subsubsection.3.1.2.14}} 56 | \newlabel{namespacegdb__utils_a5fe1761fbd0a4c2b9f707c2dfad64575}{{3.1.2.14}{9}{search\_\-functions\relax }{subsubsection.3.1.2.14}{}} 57 | \@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.15}search\_\discretionary {-}{}{}processes}{9}{subsubsection.3.1.2.15}} 58 | \newlabel{namespacegdb__utils_acd7370f13df479c88d906e889b689da5}{{3.1.2.15}{9}{search\_\-processes\relax }{subsubsection.3.1.2.15}{}} 59 | \@writefile{toc}{\contentsline {chapter}{\numberline {4}File Documentation}{11}{chapter.4}} 60 | \@writefile{lof}{\addvspace {10\p@ }} 61 | \@writefile{lot}{\addvspace {10\p@ }} 62 | \@writefile{toc}{\contentsline {section}{\numberline {4.1}gdb\_\discretionary {-}{}{}utils.py File Reference}{11}{section.4.1}} 63 | \newlabel{gdb__utils_8py}{{4.1}{11}{gdb\_\-utils.py File Reference\relax }{section.4.1}{}} 64 | -------------------------------------------------------------------------------- /latex/refman.idx: -------------------------------------------------------------------------------- 1 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{5} 2 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}!assemble\_\discretionary {-}{}{}instructions@{assemble\_\discretionary {-}{}{}instructions}|hyperpage}{6} 3 | \indexentry{assemble\_\discretionary {-}{}{}instructions@{assemble\_\discretionary {-}{}{}instructions}!gdb_utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{6} 4 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}!disassemble\_\discretionary {-}{}{}count@{disassemble\_\discretionary {-}{}{}count}|hyperpage}{6} 5 | \indexentry{disassemble\_\discretionary {-}{}{}count@{disassemble\_\discretionary {-}{}{}count}!gdb_utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{6} 6 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}!disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instruction@{disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instruction}|hyperpage}{6} 7 | \indexentry{disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instruction@{disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instruction}!gdb_utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{6} 8 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}!disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instructions@{disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instructions}|hyperpage}{7} 9 | \indexentry{disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instructions@{disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instructions}!gdb_utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{7} 10 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}!disassemble\_\discretionary {-}{}{}function@{disassemble\_\discretionary {-}{}{}function}|hyperpage}{7} 11 | \indexentry{disassemble\_\discretionary {-}{}{}function@{disassemble\_\discretionary {-}{}{}function}!gdb_utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{7} 12 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}!disassemble\_\discretionary {-}{}{}range@{disassemble\_\discretionary {-}{}{}range}|hyperpage}{7} 13 | \indexentry{disassemble\_\discretionary {-}{}{}range@{disassemble\_\discretionary {-}{}{}range}!gdb_utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{7} 14 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}!execute\_\discretionary {-}{}{}external@{execute\_\discretionary {-}{}{}external}|hyperpage}{7} 15 | \indexentry{execute\_\discretionary {-}{}{}external@{execute\_\discretionary {-}{}{}external}!gdb_utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{7} 16 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}!execute\_\discretionary {-}{}{}external\_\discretionary {-}{}{}output@{execute\_\discretionary {-}{}{}external\_\discretionary {-}{}{}output}|hyperpage}{8} 17 | \indexentry{execute\_\discretionary {-}{}{}external\_\discretionary {-}{}{}output@{execute\_\discretionary {-}{}{}external\_\discretionary {-}{}{}output}!gdb_utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{8} 18 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}!execute\_\discretionary {-}{}{}output@{execute\_\discretionary {-}{}{}output}|hyperpage}{8} 19 | \indexentry{execute\_\discretionary {-}{}{}output@{execute\_\discretionary {-}{}{}output}!gdb_utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{8} 20 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}!normalized\_\discretionary {-}{}{}argv@{normalized\_\discretionary {-}{}{}argv}|hyperpage}{8} 21 | \indexentry{normalized\_\discretionary {-}{}{}argv@{normalized\_\discretionary {-}{}{}argv}!gdb_utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{8} 22 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}!parse\_\discretionary {-}{}{}disassembled\_\discretionary {-}{}{}output@{parse\_\discretionary {-}{}{}disassembled\_\discretionary {-}{}{}output}|hyperpage}{8} 23 | \indexentry{parse\_\discretionary {-}{}{}disassembled\_\discretionary {-}{}{}output@{parse\_\discretionary {-}{}{}disassembled\_\discretionary {-}{}{}output}!gdb_utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{8} 24 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}!process\_\discretionary {-}{}{}mappings@{process\_\discretionary {-}{}{}mappings}|hyperpage}{8} 25 | \indexentry{process\_\discretionary {-}{}{}mappings@{process\_\discretionary {-}{}{}mappings}!gdb_utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{8} 26 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}!read\_\discretionary {-}{}{}string@{read\_\discretionary {-}{}{}string}|hyperpage}{9} 27 | \indexentry{read\_\discretionary {-}{}{}string@{read\_\discretionary {-}{}{}string}!gdb_utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{9} 28 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}!search\_\discretionary {-}{}{}functions@{search\_\discretionary {-}{}{}functions}|hyperpage}{9} 29 | \indexentry{search\_\discretionary {-}{}{}functions@{search\_\discretionary {-}{}{}functions}!gdb_utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{9} 30 | \indexentry{gdb\_\discretionary {-}{}{}utils@{gdb\_\discretionary {-}{}{}utils}!search\_\discretionary {-}{}{}processes@{search\_\discretionary {-}{}{}processes}|hyperpage}{9} 31 | \indexentry{search\_\discretionary {-}{}{}processes@{search\_\discretionary {-}{}{}processes}!gdb_utils@{gdb\_\discretionary {-}{}{}utils}|hyperpage}{9} 32 | \indexentry{gdb\_\discretionary {-}{}{}utils.py@{gdb\_\discretionary {-}{}{}utils.py}|hyperpage}{11} 33 | -------------------------------------------------------------------------------- /latex/refman.ilg: -------------------------------------------------------------------------------- 1 | This is makeindex, version 2.15 [TeX Live 2009] (kpathsea + Thai support). 2 | Scanning input file refman.idx....done (32 entries accepted, 0 rejected). 3 | Sorting entries....done (166 comparisons). 4 | Generating output file refman.ind....done (78 lines written, 0 warnings). 5 | Output written in refman.ind. 6 | Transcript written in refman.ilg. 7 | -------------------------------------------------------------------------------- /latex/refman.ind: -------------------------------------------------------------------------------- 1 | \begin{theindex} 2 | 3 | \item {assemble\_\discretionary {-}{}{}instructions} 4 | \subitem {gdb\_\discretionary {-}{}{}utils}, \hyperpage{6} 5 | 6 | \indexspace 7 | 8 | \item {disassemble\_\discretionary {-}{}{}count} 9 | \subitem {gdb\_\discretionary {-}{}{}utils}, \hyperpage{6} 10 | \item {disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instruction} 11 | \subitem {gdb\_\discretionary {-}{}{}utils}, \hyperpage{6} 12 | \item {disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instructions} 13 | \subitem {gdb\_\discretionary {-}{}{}utils}, \hyperpage{7} 14 | \item {disassemble\_\discretionary {-}{}{}function} 15 | \subitem {gdb\_\discretionary {-}{}{}utils}, \hyperpage{7} 16 | \item {disassemble\_\discretionary {-}{}{}range} 17 | \subitem {gdb\_\discretionary {-}{}{}utils}, \hyperpage{7} 18 | 19 | \indexspace 20 | 21 | \item {execute\_\discretionary {-}{}{}external} 22 | \subitem {gdb\_\discretionary {-}{}{}utils}, \hyperpage{7} 23 | \item {execute\_\discretionary {-}{}{}external\_\discretionary {-}{}{}output} 24 | \subitem {gdb\_\discretionary {-}{}{}utils}, \hyperpage{8} 25 | \item {execute\_\discretionary {-}{}{}output} 26 | \subitem {gdb\_\discretionary {-}{}{}utils}, \hyperpage{8} 27 | 28 | \indexspace 29 | 30 | \item {gdb\_\discretionary {-}{}{}utils}, \hyperpage{5} 31 | \subitem {assemble\_\discretionary {-}{}{}instructions}, 32 | \hyperpage{6} 33 | \subitem {disassemble\_\discretionary {-}{}{}count}, \hyperpage{6} 34 | \subitem {disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instruction}, 35 | \hyperpage{6} 36 | \subitem {disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instructions}, 37 | \hyperpage{7} 38 | \subitem {disassemble\_\discretionary {-}{}{}function}, 39 | \hyperpage{7} 40 | \subitem {disassemble\_\discretionary {-}{}{}range}, \hyperpage{7} 41 | \subitem {execute\_\discretionary {-}{}{}external}, \hyperpage{7} 42 | \subitem {execute\_\discretionary {-}{}{}external\_\discretionary {-}{}{}output}, 43 | \hyperpage{8} 44 | \subitem {execute\_\discretionary {-}{}{}output}, \hyperpage{8} 45 | \subitem {normalized\_\discretionary {-}{}{}argv}, \hyperpage{8} 46 | \subitem {parse\_\discretionary {-}{}{}disassembled\_\discretionary {-}{}{}output}, 47 | \hyperpage{8} 48 | \subitem {process\_\discretionary {-}{}{}mappings}, \hyperpage{8} 49 | \subitem {read\_\discretionary {-}{}{}string}, \hyperpage{9} 50 | \subitem {search\_\discretionary {-}{}{}functions}, \hyperpage{9} 51 | \subitem {search\_\discretionary {-}{}{}processes}, \hyperpage{9} 52 | \item {gdb\_\discretionary {-}{}{}utils.py}, \hyperpage{11} 53 | 54 | \indexspace 55 | 56 | \item {normalized\_\discretionary {-}{}{}argv} 57 | \subitem {gdb\_\discretionary {-}{}{}utils}, \hyperpage{8} 58 | 59 | \indexspace 60 | 61 | \item {parse\_\discretionary {-}{}{}disassembled\_\discretionary {-}{}{}output} 62 | \subitem {gdb\_\discretionary {-}{}{}utils}, \hyperpage{8} 63 | \item {process\_\discretionary {-}{}{}mappings} 64 | \subitem {gdb\_\discretionary {-}{}{}utils}, \hyperpage{8} 65 | 66 | \indexspace 67 | 68 | \item {read\_\discretionary {-}{}{}string} 69 | \subitem {gdb\_\discretionary {-}{}{}utils}, \hyperpage{9} 70 | 71 | \indexspace 72 | 73 | \item {search\_\discretionary {-}{}{}functions} 74 | \subitem {gdb\_\discretionary {-}{}{}utils}, \hyperpage{9} 75 | \item {search\_\discretionary {-}{}{}processes} 76 | \subitem {gdb\_\discretionary {-}{}{}utils}, \hyperpage{9} 77 | 78 | \end{theindex} 79 | -------------------------------------------------------------------------------- /latex/refman.out: -------------------------------------------------------------------------------- 1 | \BOOKMARK [0][-]{chapter.1}{\376\377\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000I\000n\000d\000e\000x}{} 2 | \BOOKMARK [1][-]{section.1.1}{\376\377\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000L\000i\000s\000t}{chapter.1} 3 | \BOOKMARK [0][-]{chapter.2}{\376\377\000F\000i\000l\000e\000\040\000I\000n\000d\000e\000x}{} 4 | \BOOKMARK [1][-]{section.2.1}{\376\377\000F\000i\000l\000e\000\040\000L\000i\000s\000t}{chapter.2} 5 | \BOOKMARK [0][-]{chapter.3}{\376\377\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{} 6 | \BOOKMARK [1][-]{section.3.1}{\376\377\000g\000d\000b\000\137\000u\000t\000i\000l\000s\000\040\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3} 7 | \BOOKMARK [2][-]{subsection.3.1.1}{\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.1} 8 | \BOOKMARK [2][-]{subsection.3.1.2}{\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.1} 9 | \BOOKMARK [3][-]{subsubsection.3.1.2.1}{\376\377\000a\000s\000s\000e\000m\000b\000l\000e\000\137\000i\000n\000s\000t\000r\000u\000c\000t\000i\000o\000n\000s}{subsection.3.1.2} 10 | \BOOKMARK [3][-]{subsubsection.3.1.2.2}{\376\377\000d\000i\000s\000a\000s\000s\000e\000m\000b\000l\000e\000\137\000c\000o\000u\000n\000t}{subsection.3.1.2} 11 | \BOOKMARK [3][-]{subsubsection.3.1.2.3}{\376\377\000d\000i\000s\000a\000s\000s\000e\000m\000b\000l\000e\000\137\000c\000u\000r\000r\000e\000n\000t\000\137\000i\000n\000s\000t\000r\000u\000c\000t\000i\000o\000n}{subsection.3.1.2} 12 | \BOOKMARK [3][-]{subsubsection.3.1.2.4}{\376\377\000d\000i\000s\000a\000s\000s\000e\000m\000b\000l\000e\000\137\000c\000u\000r\000r\000e\000n\000t\000\137\000i\000n\000s\000t\000r\000u\000c\000t\000i\000o\000n\000s}{subsection.3.1.2} 13 | \BOOKMARK [3][-]{subsubsection.3.1.2.5}{\376\377\000d\000i\000s\000a\000s\000s\000e\000m\000b\000l\000e\000\137\000f\000u\000n\000c\000t\000i\000o\000n}{subsection.3.1.2} 14 | \BOOKMARK [3][-]{subsubsection.3.1.2.6}{\376\377\000d\000i\000s\000a\000s\000s\000e\000m\000b\000l\000e\000\137\000r\000a\000n\000g\000e}{subsection.3.1.2} 15 | \BOOKMARK [3][-]{subsubsection.3.1.2.7}{\376\377\000e\000x\000e\000c\000u\000t\000e\000\137\000e\000x\000t\000e\000r\000n\000a\000l}{subsection.3.1.2} 16 | \BOOKMARK [3][-]{subsubsection.3.1.2.8}{\376\377\000e\000x\000e\000c\000u\000t\000e\000\137\000e\000x\000t\000e\000r\000n\000a\000l\000\137\000o\000u\000t\000p\000u\000t}{subsection.3.1.2} 17 | \BOOKMARK [3][-]{subsubsection.3.1.2.9}{\376\377\000e\000x\000e\000c\000u\000t\000e\000\137\000o\000u\000t\000p\000u\000t}{subsection.3.1.2} 18 | \BOOKMARK [3][-]{subsubsection.3.1.2.10}{\376\377\000n\000o\000r\000m\000a\000l\000i\000z\000e\000d\000\137\000a\000r\000g\000v}{subsection.3.1.2} 19 | \BOOKMARK [3][-]{subsubsection.3.1.2.11}{\376\377\000p\000a\000r\000s\000e\000\137\000d\000i\000s\000a\000s\000s\000e\000m\000b\000l\000e\000d\000\137\000o\000u\000t\000p\000u\000t}{subsection.3.1.2} 20 | \BOOKMARK [3][-]{subsubsection.3.1.2.12}{\376\377\000p\000r\000o\000c\000e\000s\000s\000\137\000m\000a\000p\000p\000i\000n\000g\000s}{subsection.3.1.2} 21 | \BOOKMARK [3][-]{subsubsection.3.1.2.13}{\376\377\000r\000e\000a\000d\000\137\000s\000t\000r\000i\000n\000g}{subsection.3.1.2} 22 | \BOOKMARK [3][-]{subsubsection.3.1.2.14}{\376\377\000s\000e\000a\000r\000c\000h\000\137\000f\000u\000n\000c\000t\000i\000o\000n\000s}{subsection.3.1.2} 23 | \BOOKMARK [3][-]{subsubsection.3.1.2.15}{\376\377\000s\000e\000a\000r\000c\000h\000\137\000p\000r\000o\000c\000e\000s\000s\000e\000s}{subsection.3.1.2} 24 | \BOOKMARK [0][-]{chapter.4}{\376\377\000F\000i\000l\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{} 25 | \BOOKMARK [1][-]{section.4.1}{\376\377\000g\000d\000b\000\137\000u\000t\000i\000l\000s\000.\000p\000y\000\040\000F\000i\000l\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.4} 26 | -------------------------------------------------------------------------------- /latex/refman.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crossbowerbt/GDB-Python-Utils/509a91b047251ce3e2153858a4dd3372d40e2ef7/latex/refman.pdf -------------------------------------------------------------------------------- /latex/refman.tex: -------------------------------------------------------------------------------- 1 | \documentclass[a4paper]{book} 2 | \usepackage{a4wide} 3 | \usepackage{makeidx} 4 | \usepackage{graphicx} 5 | \usepackage{multicol} 6 | \usepackage{float} 7 | \usepackage{listings} 8 | \usepackage{color} 9 | \usepackage{textcomp} 10 | \usepackage{alltt} 11 | \usepackage{times} 12 | \usepackage{ifpdf} 13 | \ifpdf 14 | \usepackage[pdftex, 15 | pagebackref=true, 16 | colorlinks=true, 17 | linkcolor=blue, 18 | unicode 19 | ]{hyperref} 20 | \else 21 | \usepackage[ps2pdf, 22 | pagebackref=true, 23 | colorlinks=true, 24 | linkcolor=blue, 25 | unicode 26 | ]{hyperref} 27 | \usepackage{pspicture} 28 | \fi 29 | \usepackage[utf8]{inputenc} 30 | \usepackage{doxygen} 31 | \lstset{language=C++,inputencoding=utf8,basicstyle=\footnotesize,breaklines=true,breakatwhitespace=true,tabsize=8,numbers=left } 32 | \makeindex 33 | \setcounter{tocdepth}{3} 34 | \renewcommand{\footrulewidth}{0.4pt} 35 | \begin{document} 36 | \hypersetup{pageanchor=false} 37 | \begin{titlepage} 38 | \vspace*{7cm} 39 | \begin{center} 40 | {\Large Reference Manual}\\ 41 | \vspace*{1cm} 42 | {\large Generated by Doxygen 1.7.1}\\ 43 | \vspace*{0.5cm} 44 | {\small Tue Oct 25 2011 20:34:34}\\ 45 | \end{center} 46 | \end{titlepage} 47 | \clearemptydoublepage 48 | \pagenumbering{roman} 49 | \tableofcontents 50 | \clearemptydoublepage 51 | \pagenumbering{arabic} 52 | \hypersetup{pageanchor=true} 53 | \chapter{Namespace Index} 54 | \input{namespaces} 55 | \chapter{File Index} 56 | \input{files} 57 | \chapter{Namespace Documentation} 58 | \input{namespacegdb__utils} 59 | \chapter{File Documentation} 60 | \input{gdb__utils_8py} 61 | \printindex 62 | \end{document} 63 | -------------------------------------------------------------------------------- /latex/refman.toc: -------------------------------------------------------------------------------- 1 | \contentsline {chapter}{\numberline {1}Namespace Index}{1}{chapter.1} 2 | \contentsline {section}{\numberline {1.1}Namespace List}{1}{section.1.1} 3 | \contentsline {chapter}{\numberline {2}File Index}{3}{chapter.2} 4 | \contentsline {section}{\numberline {2.1}File List}{3}{section.2.1} 5 | \contentsline {chapter}{\numberline {3}Namespace Documentation}{5}{chapter.3} 6 | \contentsline {section}{\numberline {3.1}gdb\_\discretionary {-}{}{}utils Namespace Reference}{5}{section.3.1} 7 | \contentsline {subsection}{\numberline {3.1.1}Detailed Description}{6}{subsection.3.1.1} 8 | \contentsline {subsection}{\numberline {3.1.2}Function Documentation}{6}{subsection.3.1.2} 9 | \contentsline {subsubsection}{\numberline {3.1.2.1}assemble\_\discretionary {-}{}{}instructions}{6}{subsubsection.3.1.2.1} 10 | \contentsline {subsubsection}{\numberline {3.1.2.2}disassemble\_\discretionary {-}{}{}count}{6}{subsubsection.3.1.2.2} 11 | \contentsline {subsubsection}{\numberline {3.1.2.3}disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instruction}{7}{subsubsection.3.1.2.3} 12 | \contentsline {subsubsection}{\numberline {3.1.2.4}disassemble\_\discretionary {-}{}{}current\_\discretionary {-}{}{}instructions}{7}{subsubsection.3.1.2.4} 13 | \contentsline {subsubsection}{\numberline {3.1.2.5}disassemble\_\discretionary {-}{}{}function}{7}{subsubsection.3.1.2.5} 14 | \contentsline {subsubsection}{\numberline {3.1.2.6}disassemble\_\discretionary {-}{}{}range}{7}{subsubsection.3.1.2.6} 15 | \contentsline {subsubsection}{\numberline {3.1.2.7}execute\_\discretionary {-}{}{}external}{8}{subsubsection.3.1.2.7} 16 | \contentsline {subsubsection}{\numberline {3.1.2.8}execute\_\discretionary {-}{}{}external\_\discretionary {-}{}{}output}{8}{subsubsection.3.1.2.8} 17 | \contentsline {subsubsection}{\numberline {3.1.2.9}execute\_\discretionary {-}{}{}output}{8}{subsubsection.3.1.2.9} 18 | \contentsline {subsubsection}{\numberline {3.1.2.10}normalized\_\discretionary {-}{}{}argv}{8}{subsubsection.3.1.2.10} 19 | \contentsline {subsubsection}{\numberline {3.1.2.11}parse\_\discretionary {-}{}{}disassembled\_\discretionary {-}{}{}output}{8}{subsubsection.3.1.2.11} 20 | \contentsline {subsubsection}{\numberline {3.1.2.12}process\_\discretionary {-}{}{}mappings}{9}{subsubsection.3.1.2.12} 21 | \contentsline {subsubsection}{\numberline {3.1.2.13}read\_\discretionary {-}{}{}string}{9}{subsubsection.3.1.2.13} 22 | \contentsline {subsubsection}{\numberline {3.1.2.14}search\_\discretionary {-}{}{}functions}{9}{subsubsection.3.1.2.14} 23 | \contentsline {subsubsection}{\numberline {3.1.2.15}search\_\discretionary {-}{}{}processes}{9}{subsubsection.3.1.2.15} 24 | \contentsline {chapter}{\numberline {4}File Documentation}{11}{chapter.4} 25 | \contentsline {section}{\numberline {4.1}gdb\_\discretionary {-}{}{}utils.py File Reference}{11}{section.4.1} 26 | --------------------------------------------------------------------------------