分段错误在ADA中打开文件

Mic*_*ler 6 linux file-io ada segmentation-fault

我必须将一些用ADA编写的遗留软件从Windows移植到Linux.程序编译正常,但在执行时以分段错误终止.

当程序试图打开文件(文件存在;)时发生段错误.奇怪的是,该程序成功地在执行早期打开另一个文件而没有错误.两个文件都是二进制文件.

使用gdb逐步执行程序,我可以追踪执行的最后一行

DIO.Open (FP (File), To_FCB (Mode), Name, Form);
Run Code Online (Sandbox Code Playgroud)

它在a-direio.adb第167行中定义.

如何进一步调查故障原因?DIO.Open的参数值看起来没问题(它们与上一次成功调用DIO.Open相同,但文件名除外).任何提示都表示赞赏.


编辑

这是最终调用DIO.Open的代码:

procedure Open
 (The_File      : in out File_Type;
  The_Mode      : in     A_DB_Mode := DBS_Database_Types.InOut_DB;
  The_Name      : in     String;
  The_Form      : in     String    := "") is
begin

  Ada_File_IO.Open
    (File => The_File,
     Mode => DB_Mode_To_File_Mode(The_Mode),
     Name => The_Name,
     Form => The_Form);

exception
  when Ada_File_IO.Status_Error => raise Status_Error;
  when Ada_File_IO.Name_Error   => raise Name_Error;
  when Ada_File_IO.Use_Error    => raise Use_Error;

end Open;
Run Code Online (Sandbox Code Playgroud)

其中ADA_File_IO声明为

package Ada_File_IO is 
  new Ada.Direct_IO(Element_Type => GNL_Universal_Representation.An_Item);
Run Code Online (Sandbox Code Playgroud)

GNL_Universal_Representation.An_Item解析为

subtype An_Item is GNL_Basic_Types.A_Byte;
type A_Byte is mod 2**Byte_Size;
Run Code Online (Sandbox Code Playgroud)

DB_Mode_To_File_Mode(The_Mode)解析为Ada_File_IO.In_File.


编辑(2)

这是带有一些文件名的gdb输出(由Brian建议)

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb563db40 (LWP 9887)]
0x081053af in system.file_io.open ()
(gdb) bt
#0  0x081053af in system.file_io.open ()
#1  0x080fd447 in system.direct_io.open ()
#2  0x08066182 in dbs_file.ada_file_io.open (file=0x0, mode=in_file, name=..., 
    form=...)
    at /media/chmiwah/ADA/lib/gcc/i686-pc-linux-gnu/4.7.4/adainclude/a-direio.adb:167
#3  0x080665cc in dbs_file.open (the_file=0x0, the_mode=in_db, the_name=..., 
    the_form=...)
    at /media/chmiwah/GISMO/bbp-benchmark/code/rebsys/src/dbs/ntv/bdy/dbs_file.adb:108
#4  0x080631b0 in dbs_database.open (the_database=0xb5500468, the_mode=in_db, 
    the_name=..., the_form=..., using_the_definition=0xb5646008)
    at /media/chmiwah/GISMO/bbp-benchmark/code/rebsys/src/dbs/gnc/bdy/dbs_database.adb:363
Run Code Online (Sandbox Code Playgroud)

Cam*_*err 1

我发现您正在使用多线程程序。使用 gdb 时,请注意“bt”不会很有用,因为它只显示一个线程(我不记得这是主线程还是当前线程)。

相反,使用以下内容:

thread apply all bt 
Run Code Online (Sandbox Code Playgroud)

或者

thread apply all bt full
Run Code Online (Sandbox Code Playgroud)

此外,使用strace -f -e trace=file your_program args还可用于确定故障是在系统调用打开之前还是之后发生。

了解您正在使用的编译器版本以及使用哪些选项来构建它(特别是如果禁用了任何警告)将非常有用。

文件名编码是否大于或小于 US-ASCII?