Find which assembly instruction caused an Illegal Instruction error without debugging

后端 未结 6 1937
走了就别回头了
走了就别回头了 2020-12-24 05:57

While running a program I\'ve written in assembly, I get Illegal instruction error. Is there a way to know which instruction is causing the error, without debug

6条回答
  •  失恋的感觉
    2020-12-24 06:26

    Recently I experienced a crash due to a 132 exit status code (128 + 4: program interrupted by a signal + illegal instruction signal). Here's how I figured out what instruction was causing the crash.

    First, I enabled core dumps:

    $ ulimit -c unlimited
    

    Interestingly, the folder from where I was running the binary contained a folder named core. I had to tell Linux to add the PID to the core dump:

    $ sudo sysctl -w kernel.core_uses_pid=1
    

    Then I run my program and got a core named core.23650. I loaded the binary and the core with gdb.

    $ gdb program core.23650
    

    Once I got into gdb, it showed up the following information:

    Program terminated with signal SIGILL, Illegal instruction.
    #0  0x00007f58e9efd019 in ?? ()
    

    That means my program crashed due to an illegal instruction at 0x00007f58e9efd019 address memory. Then I switched to asm layout to check the last instruction executed:

    (gdb) layout asm
    >|0x7f58e9efd019  vpmaskmovd (%r8),%ymm15,%ymm0
     |0x7f58e9efd01e  vpmaskmovd %ymm0,%ymm15,(%rdi)
     |0x7f58e9efd023  add    $0x4,%rdi
     |0x7f58e9efd027  add    $0x0,%rdi
    

    It was instruction vpmaskmovd that caused the error. Apparently, I was trying to run a program aimed for AVX2 architecture on a system which lacks support for AVX2 instruction set.

    $ cat /proc/cpuinfo | grep avx2
    

    Lastly, I confirmed vpmaskmovd is an AVX2 only instruction.

提交回复
热议问题