Примечание: в аварийном сбое x86
есть два интересных регистра.
Первый, EIP , указывает адрес кода, по которому произошло исключение. В ответе RichQ он использует addr2line, чтобы показать исходную строку, соответствующую адресу сбоя. Но EIP может быть недействительным; если вы вызываете нулевой указатель на функцию, это может быть 0x00000000
, а если вы повредите свой стек вызовов, в результате возврата любое случайное значение может оказаться в EIP.
Второй, CR2 , указывает адрес данных, вызвавший ошибку сегментации. В примере RichQ он настраивает i как нулевой указатель, а затем обращается к нему. В этом случае CR2 будет 0x00000000
. Но если вы измените:
int j = *i
до:
int j = i[2];
Затем вы пытаетесь получить доступ к адресу 0x00000008
, и это то, что будет найдено в CR2.