【问题标题】:How can I find which instruction is crashing my program with an Illegal Instruction error?我怎样才能找到哪个指令使我的程序因非法指令错误而崩溃?
【发布时间】:2018-08-20 20:10:03
【问题描述】:

我在 Windows 上使用 Mingw32 并尝试读取 CPU 微码修订版。

我遇到了非法指令崩溃(通过 gdb 看到),但我无法确定是哪条指令导致它。

我如何找出哪条指令是非法的,以及我的程序出了什么问题?我正在尝试打印 EDX 寄存器。

#include<stdio.h>

int main(int argc, char *argv[])
{
    int cookie = 42;

    asm(
        "MOVL $0x08, %%ecx\n\t"
        "XOR %%eax, %%eax\n\t"
        "XOR %%edx, %%edx\n\t"
        "WRMSR\n\t"
        "MOVL 1, %%EAX\n\t"
        "cpuid\n\t"
        "MOVL $0x08, %%ecx\n\t"
        "rdmsr\n\t"
        : "=rd"(cookie)
        :
        : "eax", "ecx", "edx"
    );

    printf("%d\n", cookie);
}

【问题讨论】:

  • 您的问题几乎肯定是WRMSR,因为(根据文档):此指令必须在权限级别 0 或实地址模式下执行。但是,如果你注释掉这个写,RDMSR 会给你同样的问题(出于同样的原因)。要回答实际问题:您通常可以通过使用调试器单步执行代码来找到这一点。
  • 另外,我相信CPUID 更改了 ebx 的值,但您没有将其列为已修改。这可能会导致后续代码中的其他崩溃。
  • 您的调试器应该停止在出错的指令上。使用disaslayout reg 来查看是哪一个。顺便说一句,"=rd" 意味着编译器可以选择任何寄存器或 RDX。对于该约束,您需要 "=d",并且需要 "ebx" clobber 而不是 "edx"。 (输出不能是clobber。)

标签: gcc inline-assembly mingw32


【解决方案1】:

libcpuid 在 MinGW-w64 (http://libcpuid.sourceforge.net/) 上编译。

也许您可以使用它来获取您需要的信息或查看其代码以了解应该如何进行访问?

【讨论】:

  • CPUID 很简单,如果您只需要 CPUID 信息,则不需要 WRMSR 或 RDMSR。 sandpile.org/x86/msr.htm 没有提到此代码出于某种原因尝试编写的 MSR 0x08。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多