分段故障:C-Program从HPUX迁移到Linux

时间:2016-10-15 02:34:57

标签: c linux segmentation-fault

我正在尝试将一个小的c程序从hpux迁移到linux。该项目编译良好,但在运行时崩溃显示我的分段错误。我已经尝试使用strace和gdb看镜子后面,但仍然不明白。相关(截断)部分:

tts_send_2.c

包含方法

self.tableView

从该文件中调用,如下所示:

int sequenznummernabgleich(int sockfd, char *snd_id, char *rec_id, int timeout_quit) {
  TS_TEL_TAB tel_tab_S01;
  int n;

  # truncated
}

调用该方法时,我遇到了分段错误(gdb输出):

. . .
. . .  
switch(sequenznummernabgleich(sockfd,c_snd_id,c_rec_id,c_timeout_quit)) {

         /* kritischer Fehler */
         case -1:
. . .
. . .

我不明白。当我踩到使用gdb调用方法的行时,所有变量看起来都很好:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000403226 in sequenznummernabgleich (sockfd=<error reading variable: Cannot access memory at address 0x7fffff62f94c>, 
    snd_id=<error reading variable: Cannot access memory at address 0x7fffff62f940>, rec_id=<error reading variable: Cannot access memory at address 0x7fffff62f938>, 
    timeout_quit=<error reading variable: Cannot access memory at address 0x7fffff62f934>) at tts_snd_2.c:498
498 int sequenznummernabgleich(int sockfd, char *snd_id, char *rec_id, int timeout_quit) {

我还创建了一个strace输出。以下是有关上述代码的最后一部分:

strace output

有什么想法吗?我已经搜索了网络,当然还有堆栈溢出数小时而没有找到一个非常类似的情况。

由于

克里兹

2 个答案:

答案 0 :(得分:0)

我没有永久使用HP / UX,但是对于以下建议却很难忘记:

确保正确初始化变量/ struts。使用calloc而不是malloc。

也不要假设特定的位模式顺序:例如低字节然后高字节。机器的Ska endian-ness。编译器中通常有一些宏可以为您处理适当的顺序。

答案 1 :(得分:-2)

更新15.10.16

调试了几个小时后,我发现了真正的问题。在方法的第一行&#34; sequenznummernabgleich&#34;是结构的声明

TS_TEL_TAB tel_tab_S01;

这定义如下:

typedef struct {
   TS_BOF_REC   bof;
   TS_REM_REC   rem;
   TS_EOF_REC   eof;
   int          bof_len;
   int          rem_len;
   int          eof_len; 
   int          cnt;     
   char         teltyp[LEN_TELTYP+1];
   TS_TEL_ENTRY entries[MAX_TEL];
} TS_TEL_TAB;

它的嵌入式结构TS_TEL_ENTRY

typedef struct {
   int  len;
   char tel[MAX_TEL_LEN];
} TS_TEL_ENTRY;

问题是MAX_TEL_LEN的值已从512更改为1024,因此结构的大小几乎翻了一倍,导致 STACK SIZE不再够大

<强>解 只需将堆栈大小设置为8Mb到64Mb。这可以使用ulimit命令(在linux下)来实现。

  

列出当前堆栈大小:ulimit -s

     

将堆栈大小设置为64Mb:ulimit -s 65535

注意:堆栈大小的值以kB为单位。

有关ulimit命令的简短参考,请查看@ ss64