diff options
-rw-r--r-- | gdb/doc/gdb.texinfo | 5 | ||||
-rw-r--r-- | gdb/python/lib/gdb/dap/disassemble.py | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dap/basic-dap.exp | 9 |
3 files changed, 18 insertions, 1 deletions
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index cd86da5..1463f50 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -39097,6 +39097,11 @@ The target to which @value{GDBN} should connect. This is a string and is passed to the @code{target remote} command. @xref{Connecting}. @end table +In response to the @code{disassemble} request, DAP allows the client +to return the bytes of each instruction in an implementation-defined +format. @value{GDBN} implements this by sending a string with the +bytes encoded in hex, like @code{"55a2b900"}. + @node JIT Interface @chapter JIT Compilation Interface @cindex just-in-time compilation diff --git a/gdb/python/lib/gdb/dap/disassemble.py b/gdb/python/lib/gdb/dap/disassemble.py index bc091eb..dda2f43 100644 --- a/gdb/python/lib/gdb/dap/disassemble.py +++ b/gdb/python/lib/gdb/dap/disassemble.py @@ -21,18 +21,21 @@ from .startup import send_gdb_with_response, in_gdb_thread @in_gdb_thread def _disassemble(pc, skip_insns, count): + inf = gdb.selected_inferior() try: arch = gdb.selected_frame().architecture() except gdb.error: # Maybe there was no frame. - arch = gdb.selected_inferior().architecture() + arch = inf.architecture() result = [] total_count = skip_insns + count for elt in arch.disassemble(pc, count=total_count)[skip_insns:]: + mem = inf.read_memory(elt["addr"], elt["length"]) result.append( { "address": hex(elt["addr"]), "instruction": elt["asm"], + "instructionBytes": mem.hex(), } ) return { diff --git a/gdb/testsuite/gdb.dap/basic-dap.exp b/gdb/testsuite/gdb.dap/basic-dap.exp index 853e153..ef3c535 100644 --- a/gdb/testsuite/gdb.dap/basic-dap.exp +++ b/gdb/testsuite/gdb.dap/basic-dap.exp @@ -191,6 +191,15 @@ set obj [dap_check_request_and_response "disassemble one instruction" \ $insn_pc]] set response [lindex $obj 0] gdb_assert { [dict exists $response body instructions] } "instructions in disassemble output" +foreach insn [dict get $response body instructions] { + gdb_assert {[dict exists $insn instructionBytes]} \ + "instruction bytes in disassemble output" + set bytes [dict get $insn instructionBytes] + gdb_assert {[string length $bytes] % 2 == 0} \ + "even number of digits" + gdb_assert {[regexp "^\[0-9A-Fa-f\]+\$" $bytes]} \ + "instructionBytes is hex" +} set obj [dap_check_request_and_response "command repl" \ evaluate {o expression [s {output 23}] context [s repl]}] |