0

我有一些与一些 C 函数接口的 ada 代码,我无法在由 C 代码生成/引发的 ada 代码中捕获内存异常/SIGSEGV 信号。我正在使用运行 C 函数的 ada 任务,但我知道 C 代码中存在问题的唯一方法是,当我尝试安排更多任务时,ada 代码会引发TASKING_ERROR. 这没关系,但不可能确切地找出问题的根源,因为问题的唯一迹象是TASKING_ERROR我的 ada 任务调度程序中的“一直向上”。我可能会采用什么策略来查明任务错误的实际原因?

任何帮助或想法将不胜感激。

4

1 回答 1

5

在您的任务中尝试最后机会异常处理程序,使用 编译-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)。

于 2013-06-05T16:55:45.770 回答