【问题标题】:How do I set a software breakpoint on an ARM processor?如何在 ARM 处理器上设置软件断点?
【发布时间】:2012-07-05 22:03:20
【问题描述】:

我如何做相当于 x86 软件中断的操作:

asm( "int $3" )

在 ARM 处理器(特别是 Cortex A8)上生成会中断 gdb 下执行的事件?

【问题讨论】:

  • 使用 BKPT 指令生成的 SIGBUS 似乎弄乱了程序计数器。
  • 使用 swi 指令,我相信 svc 是该指令的另一个名称,具体取决于 arm 的风格。
  • SWI 指令取决于操作系统/调试器。 Angel 调试器将代码 0x18 定义为 ReportException,将子代码 0x20020 定义为断点。它不是便携式的。 infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0058d/…

标签: debugging assembly gdb arm


【解决方案1】:

我们可以使用断点 inst:

或者我们可以使用UND 伪指令来生成未定义的指令,如果处理器尝试执行它将导致异常。

【讨论】:

  • 在第一个项目符号中,您可能指的是 A64,而不是 A32?然后,我认为第二个项目符号应该是“A32 和 T16”
【解决方案2】:

虽然最初的问题是关于 ARMv7-A 的 Cortex-A7,但在 ARMv8 GDB 上使用

brk #0

【讨论】:

    【解决方案3】:

    在我的 armv7hl(带有 linux 4.1.15 的 i.MX6q)系统上,要在另一个进程中设置断点,我使用:

    ptrace(PTRACE_POKETEXT, pid, 地址, 0xe7f001f0)

    我在 strace'ing gdb 之后选择那个值 :)

    这很完美:我可以检查被跟踪的进程,恢复原始指令,然后使用 PTRACE_CONT 重新启动进程。

    【讨论】:

    • 该指令是否仅适用于 armv7 或者也适用于 arm v4?
    【解决方案4】:

    __asm__ __volatile__ ("bkpt #0");

    请参阅BKPT 人条目。

    【讨论】:

    • 如果您的程序集不使用 args,则不需要 volatile
    【解决方案5】:

    我有一个简单的库 (scottt/debugbreak) 就是为了这个:

    #include <debugbreak.h>
    ...
    debug_break();
    

    只需将单个 debugbreak.h 标头复制到您的代码中,它就会正确处理 ARM、AArch64、i386、x86-64 甚至 MSVC。

    【讨论】:

      【解决方案6】:

      对于 ARM 上的 Windows,内在的 __debugbreak() 仍然可以使用未定义的操作码。

      nt!DbgBreakPointWithStatus:
      defe     __debugbreak
      

      【讨论】:

        【解决方案7】:

        使用 arm-none-eabi-gdb.exe 交叉编译器,这对我很有用(感谢 Igor 的回答):

        __asm__("BKPT");
        

        【讨论】:

          【解决方案8】:

          ARM 没有定义特定的断点指令。在不同的操作系统中可能会有所不同。在 ARM Linux 上,它通常是 ARM 模式下的 UND 操作码(例如 FE DE FF E7)和 Thumb 中的 BKPT(BE BE)。

          使用 GCC 编译器,您通常可以使用 __builtin_trap() 内部函数来生成特定于平台的断点。另一个选项是raise(SIGTRAP)

          【讨论】:

          • GCC/clang 假定 __builtin_trap() 之后的代码无法访问,即使在 -O0 处也是如此。在godbolt.org/z/RNc7kY 上,我们可以看到对于 ARM,.inst 0xe7f000f0 之后什么都没有,甚至函数末尾的 bx lr 也没有。而在 x86 上,它编译为 ud2(非法指令),再次省略代码来实现后面的 C 语句。即使在-O0,ARM gcc8.2 仍然省略了函数尾声,尽管有后面的 C 语句的代码。但这使它无法使用。
          • @PeterCordes:我建议将其置于运行时条件下。
          • @yfr24493AzzrggAcom 你可以提出一个新问题
          • 嗨朋友我已经这样做了,但没有得到好的答案stackoverflow.com/questions/61649711/…
          猜你喜欢
          • 2013-12-24
          • 2014-03-29
          • 1970-01-01
          • 1970-01-01
          • 2014-04-13
          • 2011-11-19
          • 2017-10-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多