【问题标题】:Debugging Instruction Pointer when IP points to 0IP指向0时调试指令指针
【发布时间】:2014-03-14 02:51:55
【问题描述】:

假设您正在运行一个在处理器上启用了中断处理的程序。指令指针指向零。我们如何才能知道导致指令指针指向 0 的原因。

我不清楚这是否与 ISR 的位置有关?据我所知,在某些处理器中,IP=0 表示重置地址。但是为什么一个正在运行的程序会去那个地址呢?

导致 IP 指向 0 的全部原因可能是什么?

【问题讨论】:

    标签: c assembly operating-system x86


    【解决方案1】:

    基本上所有jmp指令和ret都可以跳转到0。例子:

     jnz 0          ;; encoded as relative jump JNZ -(next IP)
     jmp 00000000   ;; absolute jump
     mov ebx, 0
     jmp ebx        ;; indirect jump
     call 0
     mov ecx,0
     push ecx
     ret            ;; jump through stack
    

    在 C 语言中,可以(尝试)跳过 NULL/未初始化的函数指针,以及破坏堆栈。一些深奥的技巧是插入一个异常处理程序(信号)以指向 null,或使用 longjmp。

    在 x86 架构(实模式)中,指向中断处理程序的指针从地址 0:0 开始,但不会跳转到那里。相反,该表包含要跳转到的“segment:offset”对间接

    调试方法包括二等分带有断点的代码,直到您运行的下一条指令导致您的错误。检查堆栈应该知道最后执行的函数是什么。有时堆栈仍然有效以显示完整的回调跟踪。

    【讨论】:

    • 另外,一些调试器支持记录执行的指令。
    猜你喜欢
    • 2016-01-10
    • 2016-10-21
    • 1970-01-01
    • 2019-07-30
    • 2010-12-11
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多