我正在尝试将一个小的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输出。以下是有关上述代码的最后一部分:
有什么想法吗?我已经搜索了网络,当然还有堆栈溢出数小时而没有找到一个非常类似的情况。
由于
克里兹
答案 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