См. раздел 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
show procedure status
will show you the stored procedures.
show create procedure MY_PROC
will show you the definition of a procedure. And
help show
will show you all the available options for the show
command.
DELIMITER $ DROP PROCEDURE IF EXISTS 'sp_radacct_montly_backup' $
CREATE PROCEDURE 'sp_radacct_montly_backup'()
BEGIN
DECLARE radacct_pmonth varchar(100);
DECLARE excessao SMALLINT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excessao = 1;
DECLARE radacct_pmonth varchar(100);
SET raddacct_pmonth:=(SELECT CONCAT('radacct_',YEAR(NOW()), MONTH (NOW())-1 AS radacct_pmonth);
START TRANSACTION
CREATE TABLE IF NOT EXISTS radacct_pmonth;
IF excessao = 1
THEN
SELECT 'Erro ao criar copia da tabela raddacct' As Msg;
ROLLBACK;
ELSE
DELETE FROM radius.radacct WHERE acctstoptime < date_sub(NOW(), INTERVAL 1 MONTH);
IF excessao = 1
THEN
SELECT 'Erro ao remover registros com mais de um mes' AS Msg; ROLLBACK;
ELSE
COMMIT;
END IF;
END IF;
END $ DELIMITER;
MariaDB [radius]> SHOW PROCEDURE STATUS;
->
, Если это не возвращает сообщения об ошибке после создания процедуры, почему то, когда я прошу перечислять, блокирует команду и не выходит из '->'?