PowerPC g ++ генерирует два вызова деструктора в конце основного [дубликата]

Примером этого исключаемого исключения является: Когда вы пытаетесь проверить что-то, это null.

Например:

string testString = null; //Because it doesn't have a value (i.e. it's null; "Length" cannot do what it needs to do)

if (testString.Length == 0) // Throws a nullreferenceexception
{
    //Do something
} 

Время выполнения .NET исключение NullReferenceException при попытке выполнить действие над чем-то, что не было инстанцировано, т.е. код выше.

По сравнению с ArgumentNullException, которое обычно выбрано как защитная мера, если метод ожидает, что то, что происходит

Дополнительная информация находится в C # NullReferenceException и Null Parameter .

18
задан Geoffrey Irving 17 September 2008 в 21:23
поделиться

3 ответа

См. раздел 6.2 [x0] x86_64 ABI . Это детализирует интерфейс, но не много базовых данных. Это также не зависит от C ++ и может также использоваться для других целей.

В основном есть два раздела двоичного файла ELF, испускаемые gcc, которые представляют интерес для обработки исключений. Это .eh_frame и .gcc_except_table.

.eh_frame следует за форматом DWARF (формат отладки, который в первую очередь входит в игру, когда вы используете gdb). Он имеет тот же формат, что и раздел .debug_frame, выпущенный при компиляции с -g. По существу, он содержит информацию, необходимую для возврата в состояние машинных регистров и стека в любой точке выше стека вызовов. Дополнительную информацию об этом см. В Dwarf Standard на dwarfstd.org.

.gcc_except_table содержит информацию об обработке «посадочных площадок» обработки исключений в местах расположения обработчиков. Это необходимо, чтобы знать, когда нужно прекратить раскручивание. К сожалению, этот раздел плохо документирован. Единственные фрагменты информации, которую я смог получить, поступают из списка рассылки gcc. См., В частности, этот пост

. Остальная часть информации - это то, что фактический код интерпретирует информацию, найденную в этих разделах данных. Соответствующий код живет в libstdc ++ и libgcc. В настоящий момент я не могу вспомнить, какие фигуры живут в этом. Интерпретатор для информации кадра вызова DWARF можно найти в исходном коде gcc в файле gcc / unwind-dw.c

12
ответ дан susmits 3 September 2018 в 14:22
поделиться

Хотя это похоже на Itanium, предположительно реализация аналогична для x86: обработка исключений ABI

2
ответ дан boycy 3 September 2018 в 14:22
поделиться
  • 1
    GCC следует за Itanium ABI, где это возможно, когда на этой платформе уже нет существующего ABI. Это включает x86 и x86-64. – Branan 17 September 2008 в 23:54

В настоящее время доступно мало документации, однако основная система заключается в том, что GCC переводит блоки try / catch в функции вызовов функций , а затем ссылки в библиотеке с необходимой поддержкой времени выполнения ( документация о коде построения дерева включает в себя инструкцию «бросать исключение, прямо не представленное в GIMPLE, поскольку оно реализовано вызовом функции»).

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

Существует « Обработка исключений для новичков ".

2
ответ дан Max Lybbert 3 September 2018 в 14:22
поделиться