linux – 在ADA中打开文件的分段错误

linux – 在ADA中打开文件的分段错误,第1张

概述我必须将一些用ADA编写的遗留软件从 Windows移植到 Linux.程序编译正常,但在执行时以分段错误终止. 当程序试图打开文件(文件存在;)时发生段错误.奇怪的是,该程序成功地在执行早期打开另一个文件而没有错误.两个文件都是二进制文件. 使用gdb逐步执行程序,我可以追踪执行的最后一行 DIO.Open (FP (File), To_FCB (Mode), Name, Form); 它在a- 我必须将一些用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    := "") isbegin  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
解决方法 我看到你正在使用多线程程序.使用gdb时,请注意’bt’不会非常有用,因为它只显示一个线程(如果这是主线程或当前线程,我无法记住).

相反,使用以下内容:

thread apply all bt

要么

thread apply all bt full

此外,使用strace -f -e trace = file your_program args将有助于确定故障是在系统调用open之前还是之后.

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

文件名编码是否比US-ASCII更多或更少?

总结

以上是内存溢出为你收集整理的linux – 在ADA中打开文件的分段错误全部内容,希望文章能够帮你解决linux – 在ADA中打开文件的分段错误所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/yw/1030547.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存