Ada 动态堆栈分析和操作系统退出

Ada 动态堆栈分析和操作系统退出,ada,gnat,Ada,Gnat,我正试图把Adacore的计划付诸实施 我们的项目使用了许多不同的任务,并使用 程序C_退出(状态:Interfaces.C.int); pragma导入(C,C_退出,“退出”); 这相当于导致MWE的情况 带有GNAT.OS_Lib的; 主要程序是 任务T是 条目E(大小:整数); T端; 任务体T是 开始 接受E(大小:整数)do 声明 V:整数的数组(1..Size):=(其他=>0); 开始 GNAT.OS_Lib.OS_出口(0);--这是与Adacores示例的唯一区别 终止 E

我正试图把Adacore的计划付诸实施

我们的项目使用了许多不同的任务,并使用

程序C_退出(状态:Interfaces.C.int);
pragma导入(C,C_退出,“退出”);
这相当于导致MWE的情况

带有GNAT.OS_Lib的
;
主要程序是
任务T是
条目E(大小:整数);
T端;
任务体T是
开始
接受E(大小:整数)do
声明
V:整数的数组(1..Size):=(其他=>0);
开始
GNAT.OS_Lib.OS_出口(0);--这是与Adacores示例的唯一区别
终止
E端;
T端;
开始
特惠(50万);
端干管;
使用
-u10
选项绑定此程序(使用Gnat 19.1和20.1)将不会输出任何报告(当不退出时会输出)


有没有一种解决方案可以在不“太多”更改我现有的代码库的情况下获取报告?

问题是,为了生成报告,您需要运行程序直到完成(如de Gem中所述):

-bargs-u10
开关使
-u10
传递到GNAT绑定器,该绑定器将允许检测多达十个任务,并在程序完成时输出其堆栈使用情况

当您调用
OS\u Exit
(或
C\u Exit
)时,程序只是中止(而不是完成),因为跳过了正常的程序终止/终结:

   procedure OS_Exit (Status : Integer);
   pragma No_Return (OS_Exit);
   --  Exit to OS with given status code (program is terminated). Note that
   --  this is abrupt termination. All tasks are immediately terminated. There
   --  are no finalization or other Ada-specific cleanup actions performed. On
   --  systems with atexit handlers (such as Unix and Windows), atexit handlers
   --  are called.
除了确保不调用
OS\u Exit
并确保任务正确终止之外,我这里没有任何具体的解决方案(可能其他人有)。以下是
OS_Exit
对活页夹生成代码中的代码流的影响:

b_uumain.adb(活页夹生成的代码,部分)

主功能
(argc:整数;
argv:系统地址;
环境:系统地址)
返回整数
是
--  [...]
开始
--  [...]

初始化_堆栈_分析(10) 问题是您需要运行程序直到完成才能生成报告(如de Gem中所述):

-bargs-u10
开关使
-u10
传递到GNAT绑定器,该绑定器将允许检测多达十个任务,并在程序完成时输出其堆栈使用情况

当您调用
OS\u Exit
(或
C\u Exit
)时,程序只是中止(而不是完成),因为跳过了正常的程序终止/终结:

   procedure OS_Exit (Status : Integer);
   pragma No_Return (OS_Exit);
   --  Exit to OS with given status code (program is terminated). Note that
   --  this is abrupt termination. All tasks are immediately terminated. There
   --  are no finalization or other Ada-specific cleanup actions performed. On
   --  systems with atexit handlers (such as Unix and Windows), atexit handlers
   --  are called.
除了确保不调用
OS\u Exit
并确保任务正确终止之外,我这里没有任何具体的解决方案(可能其他人有)。以下是
OS_Exit
对活页夹生成代码中的代码流的影响:

b_uumain.adb(活页夹生成的代码,部分)

主功能
(argc:整数;
argv:系统地址;
环境:系统地址)
返回整数
是
--  [...]
开始
--  [...]
初始化_堆栈_分析(10) 怎么样-

  • 用已知模式填充堆栈
  • 让C_退出调用-if available-kill()以触发coredump
  • 使用调试器分析coredump的堆栈
  • 怎么样-

  • 用已知模式填充堆栈
  • 让C_退出调用-if available-kill()以触发coredump
  • 使用调试器分析coredump的堆栈

  • 这正是我所担心的…因此从列出的4个选项中,1或多或少是我在项目中所做的,2不适用,因为我不在ravenscar(并且我使用了很多无界字符串…),3是你的答案。所以我要看看是否有gnatstack可用:)这正是我所担心的…所以从列出的4个选项中,1或多或少是我在我的项目中所做的,2是不适用的,因为我不在ravenscar(我使用了很多无界字符串…),3是根据你的答案。所以我想看看我是否有可用的gnatstack:)那么你会如何列出所有必须中止的任务?我在
    Ada.Task\u Identification
    中看不到此功能。是否有一种动态获取此列表的解决方案,以确保不需要维护列表?什么是“中止程序”异常?您不能在另一个任务中引发特定异常;您可以使用
    Ada.task\u Identification.environment\u task
    中止环境任务,但请注意这一点,以便无法采取任何进一步的行动。@jesper quorning您完全更改了答案,因此我的评论和@simon wright现在已过时:悲哀,你本可以把你的更新添加到你的消息中:)至于答案的当前状态,我必须说我不明白。我不需要coredump,因为我可以使用gdb简单地停止
    exit
    功能。但是接下来你会如何处理堆栈呢?你的意思是分析堆栈大小吗?如果是这样的话,这不会给我一个最大尺寸,而是当前的尺寸,它可能与最大尺寸完全不相关。@Vser你是对的。我应该再回答一次。仍在学习。@Vser我将练习程序并检查堆栈以查看最大使用量。仍然包含该模式的部分尚未使用。您将如何列出必须中止的所有任务?我在
    Ada.Task\u Identification
    中看不到此功能。是否有一种动态获取此列表的解决方案,以确保不需要维护列表?什么是“中止程序”异常?您不能在另一个任务中引发特定异常;您可以使用
    Ada.task\u Identification.environment\u task
    中止环境任务,但请注意这一点,以便无法采取任何进一步的行动。@jesper quorning您完全更改了答案,因此我的评论和@simon wright现在已过时:悲哀,你本可以把你的更新添加到你的消息中:)至于答案的当前状态,我必须说我不明白。我不需要coredump,因为我可以简单地停在