Обработчик исключений - PullRequest
       12

Обработчик исключений

10 голосов
/ 12 февраля 2012

Есть этот код:

char text[] = "zim";
int x = 777;

Если я посмотрю на стек, где размещены x и текст, то получится:

09 03 00 00 7a 69 6d 00

Где:

  • 09 03 00 00 = 0x309 = 777 <- int x = 777 </li>
  • 7a 69 6d 00 = символ текста [] = "zim" (код ASCII)

Теперь есть код с try..catch:

char text[] = "zim";
try{
  int x = 777;
}
catch(int){
}

Stack:

09 03 00 00 **97 85 04 08** 7a 69 6d 00

Теперь между text и x помещается новое 4-байтовое значение. Если я добавлю еще один улов, то будет что-то вроде:

09 03 00 00 **97 85 04 08** **xx xx xx xx** 7a 69 6d 00

и так далее. Я думаю, что это какое-то значение, связанное с обработкой исключений, и оно используется во время разматывания стека, чтобы найти подходящий улов, когда исключение выдается в блоке try. Однако вопрос в том, что именно это 4-байтовое значение (может быть, какой-то адрес к структуре обработчика исключения или некоторый идентификатор)?

Я использую g ++ 4.6 на 32-битной машине Linux.

Ответы [ 2 ]

5 голосов
/ 13 февраля 2012

AFAICT, это указатель на «таблицу раскручивания». Согласно предложениям по реализации Itanium ABI , процесс "[использует] таблицу раскрутки, [чтобы] найти информацию о том, как обрабатывать исключения, которые происходят на этом ПК, и, в частности, получить адрес личности подпрограмма для этого диапазона адресов. "

Идея таблиц размотки заключается в том, что данные, необходимые для разматывания стека, используются редко. Следовательно, более эффективно поместить указатель в стек и сохранить данные на другой странице. В лучшем случае эта страница может оставаться на диске и даже не должна загружаться в ОЗУ. Для сравнения, обработка ошибок в стиле C часто заканчивается в кэше L1, потому что все это встроено.

0 голосов
/ 13 февраля 2012

Нет необходимости говорить, что все это зависит от платформы и т. Д.

Это может быть адрес.Он может указывать либо на раздел кода (некоторый адрес обработчика), либо на раздел данных (указатель на структуру, сгенерированную во время сборки с информацией о кадре), либо на стек того же потока (указатель на сгенерированную во время выполнения таблицуинформация о кадре).Или это также может быть мусор, оставленный из-за требования выравнивания, которое может потребовать EH.

Например, в Win32 / x86 такого пробела нет.Для каждой функции, которая использует обработку исключений (имеет либо try/catch или __try/__except/__finally, либо объекты с d'Tors) - компилятор генерирует структуру EXCEPTION_RECORD, которая размещается в стеке (с помощью кода пролога функции).Затем, когда что-то изменяется внутри функции (объект создан / уничтожен, try/catch блок введен / завершен) - компилятор добавляет инструкцию, которая изменяет эту структуру (точнее - изменяет ее расширение).Но в стеке больше ничего не выделяется.

...