我有一些与某些C函数接口的ada代码,我在捕获由C代码生成/引发的ada代码中的内存异常/ SIGSEGV信号时遇到问题。我正在使用运行C函数的ada任务,但我知道C代码中存在问题的唯一方法是当我尝试安排更多任务时,ada代码会引发TASKING_ERROR
。这没关系,但是不可能弄清楚问题的确切位置,因为问题的唯一指示是TASKING_ERROR
"一直向上"在我的ada任务计划程序中。我可能采用什么策略来确定任务错误的实际原因?
非常感谢任何帮助或想法。
答案 0 :(得分:4)
在您的任务中尝试最后机会异常处理程序,使用-g
进行编译,并与-bargs -E
绑定(即,如果您使用的是gnatmake
;否则,{{1 }})。
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
(在Mac OS X上;在更多普通计算机上,您不需要$ 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
,而是使用-Wl,-no_pie
代替addr2line
})。