从Ada中捕获C代码中的内存异常

时间:2013-06-05 16:18:42

标签: c ada

我有一些与某些C函数接口的ada代码,我在捕获由C代码生成/引发的ada代码中的内存异常/ SIGSEGV信号时遇到问题。我正在使用运行C函数的ada任务,但我知道C代码中存在问题的唯一方法是当我尝试安排更多任务时,ada代码会引发TASKING_ERROR。这没关系,但是不可能弄清楚问题的确切位置,因为问题的唯一指示是TASKING_ERROR"一直向上"在我的ada任务计划程序中。我可能采用什么策略来确定任务错误的实际原因?

非常感谢任何帮助或想法。

1 个答案:

答案 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 })。