Почему int 3 генерирует SIGSEGV в 64-битной версии вместо остановки отладчика? - PullRequest
18 голосов
/ 03 сентября 2010

При программировании в 32-битном режиме я часто использовал int 3 в своих программах для остановки в заданном месте с помощью отладчика (встраивание инструкции в исходный код). Теперь в 64 битах он, кажется, не работает, производит очень обычный SIGSEGV под GDB и уничтожает программу без надежды («Программа завершилась с сигналом SIGSEGV, Ошибка сегментации. Программа больше не существует. "). Интересно, есть ли в 64-битном режиме другой механизм или мне нужно выполнить некоторую очистку кеша (int 3 - это динамически генерируемый код операции в этом случае (0xcc), какой-то jit-подобный код).

Ответы [ 4 ]

20 голосов
/ 03 сентября 2010

__ DebugBreak ()

Сегодня пришел коллега, чтобы спросить о как включить функциональность "int 3" 64-битные платформы. Что такое "int 3"? Это инструкция по сборке, которая используется для создания точки останова. По крайней мере это инструкция для x86 процессор, и как вы можете себе это представить очень зависит от платформы.

На 64-битных платформах нет встроенная сборка, так что ваш "__asm ​​int 3". Что делать сейчас? Что ж есть менее известная конструкция, которая на самом деле гораздо лучше использовать в этом он работает на всех платформах (x64, Itanium и x86), который __debugbreak (). Это встроенный компилятор Visual C ++ (определенный в Visual C ++ 2005 под vc \ include \ intrin.h, с кучей других классных встроенных функций) это будет эффективно действовать "Int 3" на всех платформах.

DebugBreak, вызов функции Win32 все еще вокруг, но в целом с помощью __debugbreak () - мое предпочтение, если по какой-либо другой причине, кроме вызов функции (это компилятор встроенный), и вам не нужно отлаживать символы, чтобы получить читаемый стек вызовов.

Если вы пишете C ++, вы, вероятно, не хочу писать непереносимо сборка, и это только на один меньше место, где вы должны были бы.

http://blogs.msdn.com/b/kangsu/archive/2005/09/07/462232.aspx

13 голосов
/ 22 августа 2014

Следующий код будет работать на amd64 платформе UNIX:

breakpoint.c

int main() {
    int i;     
    for(i=0; i<3;i++) {
        __asm__("int3");
    }
}

Скомпилируйте его тривиально: gcc -c breakpoint.c и запустите gdb a.out:

(gdb) run
Starting program: /tmp/a.out 

Program received signal SIGTRAP, Trace/breakpoint trap.
0x00000000004004fb in main ()

Видите ли, GDB останавливается на точке останова.

12 голосов
/ 03 сентября 2010

Ах, я понял, извини.Мне пришлось снять защиту страниц для исполнения.Int 3 по-прежнему является действительной ловушкой отладки.

0 голосов
/ 12 ноября 2017

Я рекомендую никогда не использовать asm int 3, так как он работает для всех типов сборки. Вы можете забыть строку где-нибудь в своем коде, и это может означать большие проблемы. Альтернативой является использование __ debugbreak , который действителен только в режиме отладки.

...