我有一些与一些 C 函数接口的 ada 代码,我无法在由 C 代码生成/引发的 ada 代码中捕获内存异常/SIGSEGV 信号。我正在使用运行 C 函数的 ada 任务,但我知道 C 代码中存在问题的唯一方法是,当我尝试安排更多任务时,ada 代码会引发TASKING_ERROR
. 这没关系,但不可能确切地找出问题的根源,因为问题的唯一迹象是TASKING_ERROR
我的 ada 任务调度程序中的“一直向上”。我可能会采用什么策略来查明任务错误的实际原因?
任何帮助或想法将不胜感激。
在您的任务中尝试最后机会异常处理程序,使用 编译-g
和绑定-bargs -E
(即,如果您正在使用gnatmake
; 否则,gnatbind -E
)。
segv.c
含_
void segv(void) {
char *zero = 0;
*zero = 0;
}
和
with Ada.Exceptions;
with Ada.Text_IO; use Ada.Text_IO;
procedure Call_Segv is
task T;
task body T is
procedure Segv;
pragma Import (C, Segv);
begin
Put_Line ("calling segv ...");
Segv;
Put_Line ("... done.");
exception
when E : others =>
Put_Line ("... exception: "
& Ada.Exceptions.Exception_Information (E));
end T;
begin
null;
end Call_Segv;
建筑与
$ gnatmake call_segv.adb -g -bargs -E -largs segv.o -Wl,-no_pie
我明白了
$ call_segv
calling segv ...
... exception: Exception name: CONSTRAINT_ERROR
Message: erroneous memory access
Call stack traceback locations:
0x10002cea5 0x7fff8ff8a948 0x100002077 0x100002304 0x10000ef16 0x7fff8ff9c7a0
并且堆栈跟踪解释为
$ atos -o call_segv 0x10002cea5 0x7fff8ff8a948 0x100002077 0x100002304 0x10000ef16 0x7fff8ff9c7a0
__gnat_error_handler (in call_segv) + 53
0x7fff8ff8a948
segv (in call_segv) (segv.c:3)
call_segv__tTKB.3158 (in call_segv) (call_segv.adb:10)
system__tasking__stages__task_wrapper (in call_segv) + 406
0x7fff8ff9c7a0
(那是在 Mac OS X 上;在更普通的机器上,你不需要-Wl,-no_pie
并且你会使用addr2line
而不是atos
)。