【问题标题】:Catching Memory Exceptions in C Code From Ada从 Ada 捕获 C 代码中的内存异常
【发布时间】:2013-06-05 16:18:41
【问题描述】:

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

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

【问题讨论】:

    标签: c ada


    【解决方案1】:

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

    【讨论】:

    • 以上正是我要找的。我拿了你的两个单元,用gcc -g -c segv.c 编译segv.c,然后用gnatmake call_segv.adb -g -bargs -E -largs segv.o,得到calling segv... \n Execution terminated by unhandled exception \n Exception Name: STORAGE_ERROR \n Message: s-intman.adb:124 explicit raise \n Call stack traceback locations: 0xb7fc7cb9,这不会导致任何事情。这与我在大型应用程序中遇到的问题基本相同。也许我的设置有问题?在这一点上,我觉得我已经接近解决方案了。非常感谢。
    • 您使用的是哪个操作系统/编译器?使用 Debian wheezy (GCC 4.6),我得到的结果与 Mac 非常相似;也就是说,它成功地在任务的异常处理程序中捕获了异常,并且我得到了有用的回溯,而不是您的Execution terminated by unhandled exception。使用 Win XP 和 GNAT GPL 2012,我确实得到了Execution terminated ...,并且没有像您一样对回溯的 C 部分进行有用的解释。谷歌搜索没有帮助(有一个 comp.lang.ada 线程,有人报告了这样的 C 问题)。
    • 哇,非常有趣...我们使用的是 RHEL5.4,gcc -x Ada --version 返回 4.1.2。我稍后会在以后的版本中尝试这个,看看我是否能得到更好的结果。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多