为什么我的应用程序编译为64位后会出现段错误?

时间:2012-03-22 06:55:15

标签: linux caching linux-kernel

我正在通过64位Linux系统(RHEL5.5)运行应用程序(通过64位计算机编译)。此应用程序每40-50分钟就会崩溃。我很惊讶地发现,因为当我在32位机器上运行相同的代码时它运行完全正常。

我发现有问题的系统中的可用内存只有50 MB的可能原因之一。所以我认为它因内存不足而崩溃。但我也看到系统有大约5 GB的缓存内存。我认为这个缓存内存应该可用于我的所有内存请求。我在这个假设中是正确的,或者我在一段时间后释放了这个缓存来解决这个问题。

在系统日志中,当我的应用程序崩溃时,我看到以下消息: kernel:MyApplicationName [20655]:段错误0000000030363938 rip 0000000000b35c7e rsp 00000000f322a3a0错误4

任何人都可以指出这里可能出现的问题吗?这个错误4在系统中意味着什么。

2 个答案:

答案 0 :(得分:1)

错误4是EINTR,它位于/usr/include/asm-generic/errno-base.h

#define EINTR            4      /* Interrupted system call */

但是你的问题似乎与记忆或与此错误4无关。它更可能是一个出现的错误,因为您的应用程序的代码还没有为64位系统做好准备。您的主要问题不是error 4,而是segfault

分段错误错误是指应用程序尝试使用无法或无权使用的内存时。在这种情况下,内核通常别无选择,只能阻止它。

为了获得有关此错误的更多信息,您可以使用调试符号编译应用程序,将gdb附加到您的进程,并在gdb shell thread apply all bt中使用此命令发生段错误时询问完整跟踪。

答案 1 :(得分:0)

需要时将释放缓存。你的问题很可能是糟糕的代码实践,可能你的代码假设所有的整数都是32位。