From dc257d16035f6a2cafeae53a49afd468b1b1a33f Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Wed, 12 Nov 2014 21:47:22 -0500 Subject: [PATCH] Debugger: Fix disassembler to handle newer udis86 API. In newer versions of udis86, the ud_t.mnemonic field is deprecated, and one must now call ud_insn_mnemonic() to retrieve that information. This was causing Debugger to not correctly identify subroutine calls and jump instructions, which broke the stepping code in various fun ways. --- src/apps/debugger/arch/x86/disasm/DisassemblerX86.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/apps/debugger/arch/x86/disasm/DisassemblerX86.cpp b/src/apps/debugger/arch/x86/disasm/DisassemblerX86.cpp index a681f238f2..2d8d50d983 100644 --- a/src/apps/debugger/arch/x86/disasm/DisassemblerX86.cpp +++ b/src/apps/debugger/arch/x86/disasm/DisassemblerX86.cpp @@ -153,9 +153,10 @@ DisassemblerX86::GetNextInstructionInfo(InstructionInfo& _info, instruction_type type = INSTRUCTION_TYPE_OTHER; target_addr_t targetAddress = 0; - if (fUdisData->mnemonic == UD_Icall) + ud_mnemonic_code mnemonic = ud_insn_mnemonic(fUdisData); + if (mnemonic == UD_Icall) type = INSTRUCTION_TYPE_SUBROUTINE_CALL; - else if (fUdisData->mnemonic == UD_Ijmp) + else if (mnemonic == UD_Ijmp) type = INSTRUCTION_TYPE_JUMP; if (state != NULL) targetAddress = GetInstructionTargetAddress(state); @@ -175,7 +176,8 @@ DisassemblerX86::GetNextInstructionInfo(InstructionInfo& _info, target_addr_t DisassemblerX86::GetInstructionTargetAddress(CpuState* state) const { - if (fUdisData->mnemonic != UD_Icall && fUdisData->mnemonic != UD_Ijmp) + ud_mnemonic_code mnemonic = ud_insn_mnemonic(fUdisData); + if (mnemonic != UD_Icall && mnemonic != UD_Ijmp) return 0; CpuStateX86* x86State = dynamic_cast(state);