c语言打开文件出现分段故障,linux – 在ADA中打开文件的分段错误

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

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

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

dio.Open (FP (File),To_FCB (Mode),Name,Form);

它在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;

其中ADA_File_IO声明为

package Ada_File_IO is

new Ada.Direct_IO(Element_Type => GNL_Universal_Representation.An_Item);

GNL_Universal_Representation.An_Item解析为

subtype An_Item is GNL_Basic_Types.A_Byte;

type A_Byte is mod 2**Byte_Size;

和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_form=...,using_the_definition=0xb5646008)

at /media/chmiwah/GISMO/bbp-benchmark/code/rebsys/src/dbs/gnc/bdy/dbs_database.adb:363

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值