Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在ADA中打开文件时的分段错误_Linux_File Io_Segmentation Fault_Ada - Fatal编程技术网

Linux 在ADA中打开文件时的分段错误

Linux 在ADA中打开文件时的分段错误,linux,file-io,segmentation-fault,ada,Linux,File Io,Segmentation Fault,Ada,我必须将一些用ADA编写的遗留软件从Windows移植到Linux。该程序编译良好,但在执行时会因分段错误而终止 当程序试图打开文件(该文件存在;)时,会发生segfault。奇怪的是,程序在执行的早期成功地打开了另一个文件,并且没有出现错误。这两个文件都是二进制文件 使用gdb单步执行程序,我可以跟踪到执行到的最后一行 DIO.Open (FP (File), To_FCB (Mode), Name, Form); 定义见a-direio.adb第167行 如何进一步调查故障原因?DIO.O

我必须将一些用ADA编写的遗留软件从Windows移植到Linux。该程序编译良好,但在执行时会因分段错误而终止

当程序试图打开文件(该文件存在;)时,会发生segfault。奇怪的是,程序在执行的早期成功地打开了另一个文件,并且没有出现错误。这两个文件都是二进制文件

使用gdb单步执行程序,我可以跟踪到执行到的最后一行

DIO.Open (FP (File), To_FCB (Mode), Name, Form);
定义见a-direio.adb第167行

如何进一步调查故障原因?DIO.Open的参数值看起来正常(除了文件名之外,它们与上次成功调用DIO.Open的参数值相同)。如有任何提示,我们将不胜感激


编辑 下面是最终调用DIO.Open的代码:

其中ADA_File_IO声明为

package Ada_File_IO is 
  new Ada.Direct_IO(Element_Type => GNL_Universal_Representation.An_Item);
GNL_通用表示法。一项解析为

subtype An_Item is GNL_Basic_Types.A_Byte;
type A_Byte is mod 2**Byte_Size;
DB_Mode_To_File_Mode(_Mode)解析为Ada_File_IO.In_File


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


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

相反,使用以下方法:

thread apply all bt 

此外,使用
strace-f-e trace=file您的_程序args
将有助于确定故障是在系统调用打开之前还是之后出现

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


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

我建议编译并链接调试信息和所有警告(例如
-Wall-g
),然后使用
gdb
调试器。也许使用
strace
也会有所帮助。请发布您用来调用
您的\u Direct\u IO的代码。打开
您的\u Direct\u IO
将是您的通用实例化)。另外,
Direct\u IO
实例化本身以及其中使用的任何类型信息都会很有帮助。谢谢您的提示。我已经发布了更多关于代码的信息。用于调试的编译器/链接器选项以前已设置。我现在将调查strace是否能提供一些有用的信息。鉴于底层操作系统功能之间的差异,可能值得一看文件名。根据我迄今为止看到的信息,我最担心的是,文件名来自哪里。由于程序是seg错误,似乎有可能在某个地方,由于操作系统返回的C字符串处理不当,程序创建了一个长度完全荒谬的文件名。也可以想象,这个字符串可以在多个例程之间传递,并且在调用实际查看字符串内容的子程序(例如
DIO.Open
)之前不会引起任何问题。使用strace,我发现操作系统的Open函数从未到达,因此程序在此之前一定已经崩溃。经过长时间的搜索,我发现崩溃的ADA任务的堆栈大小被配置为(使用pragma)太小。增加后,seg故障不再发生。
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
thread apply all bt 
thread apply all bt full