轰然C ++应用程序,包括ADA DLL不产生核心转储
题
如何获得一个C ++应用程序包括一个装载ADA共享库来生成核心转储的崩溃时强>
我有加载阿达共享库中,阿达码我得到这会导致程序终止与控制台输出沿着堆栈溢出错误内的C ++应用程序:
raised STORAGE ERROR
未生成核心转储文件,即使你我已启动应用程序之前发出了“的ulimit -c无限。”
同样的事情发生,如果我发送kill SIGSEGV 以应用程序。
发送杀 SIGSEGV ,以不使用ADA DLL的另一个应用程序生成一个核心转储文件只是我想要的方式它。
这里发现了一些信息: HTTP:// objectmix。 COM / ADA / 301203-蚋-fstack检查此结果work.html
已更新! 正如阿德里安提到的那样,没有矛盾,请 -s 强>将堆栈限制而的 -c 强>将核心文件限制。
还是问题依然存在。建设ADA库和 fstack检查,当我检查标志标志没有设置,所以它应该产生一个核心转储。
<击> Althou我还没有尝试过,这似乎有些奇怪。 它提到-fstack检查编译器选项+设置GNAT_STACK_LIMIT变量,但在同一时间指的是这似乎是一个矛盾的ulimit命令,设置“的ulimit -c”是我知道得到一个核心转储要生成的唯一途径在崩溃之时,如果这与fstack检查选项推断然后我们有一个赶上22日。击>
解决方案
现在,近2年后(在同一家公司还在工作作为的Kristofer,当他问的问题),在这个问题再次提出 - 最后我想我理解为什么没有产生核心转储!
在问题是由阿达运行时,默认情况下实现了一些POSIX的信号的信号处理程序引起的(用于Linux:SIGABRT,SIGFPE,SIGILL,SIGSEGV和SIGBUS)。对于GNAT / Linux中的信号处理程序被调用的 __ gnat_error_handler 强>在的 A-INIT.C 下,这看起来是这样的:
static void
__gnat_error_handler (int sig)
{
struct Exception_Data *exception;
char *msg;
static int recurse = 0;
...
switch (sig)
{
case SIGSEGV:
if (recurse)
{
exception = &constraint_error;
msg = "SIGSEGV";
}
else
{
...
msg = "stack overflow (or erroneous memory access)";
exception = &storage_error;
}
break;
}
recurse = 0;
Raise_From_Signal_Handler (exception, msg);
}
此处理程序为“过程宽”,并且将通过任何触发的信号,无论从哪个过程的一部分其来源(无论编码在阿达/ C / C ++ ...)被调用。
当调用时,该处理程序上升的阿达的异常和其离开的阿达运行时找到一个适当的异常处理程序 - 如果没有这样的处理程序被发现(例如,当通过的C ++的任何部分中产生的SIGSEGV - 代码)中,阿达运行时回落到刚刚终止进程和刚刚离开从一个简单的打印输出的 __ gnat_error_handler 强>(例如,“堆栈溢出(或错误存储器存取)”。)。
http://www2.adacore.com/gap-static/ GNAT_Book / HTML / node25.htm
要防止从处理一POSIX信号阿达运行时,并将其转换为一个阿达的异常,有可能通过使用禁用默认beahviour
<强>编译Interrupt_State(名称=>值,状态=>系统| RUNTIME | USER); 强>,
例如。禁用SIGSEGV的处理,定义
Pragma Interrupt_State(SIGSEGV, SYSTEM);
在您的阿达码 - !现在该系统的默认行为将被触发时,SIGSEGV上升,以及核心转储将产生,允许你跟踪下来问题的根源
我觉得这是需要注意的* NIX的平台上混合的Ada和C / C ++的时候,因为这可能会误导您认为从Ada的代码问题引起的(因为打印输出指示异常的非常重要的问题从阿达生成)时的问题的真正来源规定在C / C ++ - 代码...
虽然它可能是安全的禁用SIGSEGV的阿达运行时默认处理(我在任何“预期”的错误使用这种处理......那么你猜不理智的程序员,在航空软件或类似也许使用的,当某种“不得已而为之” functionallity需要保持避免的事情的发生非常糟糕的。)我猜有点谨慎,应采取然后“覆盖”阿达,运行时间处理的信号。
的一个问题可能是SIGFPE信号,这也引起了默认的阿达生成Constraint_Error-异常。这种类型的异常可以由阿达码被用作“excpected行为”。 通过附注Interrupt_State禁用SIGFPE可能严重影响的Ada代码的执行,并在“正常情况下,”你的程序崩溃 - 零的C / C ++,另一方面将出现分化 - 代码trig的蔡少芬,异常处理机制,离开你没有问题...
起源的任何痕迹实其他提示
这在我看来就像一个的真正的用好你的 AdaCore 支持。你是不是容易找到一大堆该公司以外的人谁是熟悉的牛羚阿达的运行时和的C ++。
之间的相互作用的影响我会建议用于调试您尝试在周围的一切最后一搏的异常处理程序,这反过来又转储异常堆栈把Ada代码。大多数供应商有这样做,通常是根据关Ada.Exceptions.Exception_Information和Ada.Exceptions.Exception_Message的一些方式。
看来你可以简单地调用sigaction(SIGSEGV, 0, SIG_DFL);
恢复默认的信号行为。