Encuentre qué instrucción de ensamblaje causó un error de instrucción ilegal sin depurar

Encuentre qué instrucción de ensamblaje causó un error de instrucción ilegal sin depurar


Mientras ejecuto un programa que he escrito en ensamblador, obtengo Illegal instruction error. ¿Hay alguna manera de saber qué instrucción está causando el error, sin necesidad de depurar, porque la máquina en la que estoy ejecutando no tiene un depurador ni ningún sistema de desarrollo? En otras palabras, compilo en una máquina y ejecuto en otra. No puedo probar mi programa en la máquina que estoy compilando porque no es compatible con SSE4.2. Sin embargo, la máquina en la que estoy ejecutando el programa es compatible con las instrucciones SSE4.2.


Creo que tal vez porque necesito decirle al ensamblador (YASM) que reconozca las instrucciones SSE4.2, tal como lo hacemos con gcc pasándole el -msse4.2 bandera. ¿O crees que no es la razón? ¿Alguna idea de cómo decirle a YASM que reconozca las instrucciones SSE4.2?


Tal vez debería atrapar la señal SIGILL y luego decodificar SA_SIGINFO para ver qué tipo de operación ilegal hace el programa.


Respuestas:


En realidad, a menudo obtiene un error de instrucción ilegal no porque su programa contenga un código de operación ilegal sino porque hay un error en su programa (por ejemplo, un desbordamiento de búfer) que hace que su programa salte en una dirección aleatoria con datos sin formato o en código pero no en el comienzo del código de operación.