奇怪的“*** stack smashing detected ***”问题

weird "*** stack smashing detected ***" issue

我有一个简单的批处理程序,可以在 2 CentOS 6.6 机器(一台 32 位机器和一台 64 位机器)上运行,但不能在第三台 CentOS 6.6 机器上运行(a 64 位机器)。那么,完全相同的可执行文件如何在两台机器上工作,但在第三台机器上却不能工作?

请注意,我不是在问如何解决这个问题,我是在问同一个可执行文件在 3 台不同的机器上如何表现不同。我实际上有 3 或四个不同的 C 程序匹配此行为,但我选择最简单的一个来解决问题。我的理论是 3 台机器之间 OS 级别的设置有所不同(也许我忘记安装一些库或设置一些环境变量)。我只需要帮助缩小要查看的范围,OS 类型的内容。

这可能应该转到 serverfault,因为它更像是一个与服务器相关的问题,但我担心那里的人会看到我对 C 程序的引用并要求我来这里,所以我将从这里开始。

请注意,valgrind 没有帮助。如果是这样的话,我会在我的代码中解决这个问题,但它没有显示内存问题。当我说它很简单时,我是认真的。它只是从数据库中读取一些记录,对它们进行处理,然后将它们打印到屏幕上。

感谢您提供的任何帮助。

通常堆栈粉碎警告/错误是由缓冲区溢出类型问题引起的。

我对 CentOS/Linux 的了解还不够,无法知道它的确切配置方式(我对此类问题的主要经验是在 OpenBSD 上 运行 时)。通常在编译时启用此堆栈粉碎检测功能。

如果您在启用调试符号 (-g) 的情况下编译程序并加载生成的核心文件以查看回溯,GDB 可能会在此处提供帮助。

例如,在 OpenBSD 上的一个简单测试程序中,我在 GDB 中看到以下回溯:

(gdb) bt
#0  0x00001e13837081ea in kill () at <stdin>:2
#1  0x00001e1383745b2c in __stack_smash_handler (func=0x1e117f400ebf "test_smash", damaged=Variable "damaged" is not available.
) at /usr/src/lib/libc/sys/stack_protector.c:61
#2  0x00001e117f300e91 in test_smash () at test.c:10
#3  0x0000000000000000 in ?? ()

其中 test_smash() 是一个故意溢出堆栈的函数。

使用此方法应该可以让您快速确定导致堆栈溢出的函数,并允许您在源代码中修复它。

好的,这是一个 OS 相关的外围问题。基本上,当我安装我需要的共享库时,我安装了错误版本的 ODBC 库(比我的代码习惯和编译的版本更新)。一旦我正确安装了旧版本,错误就消失了。因此,对于在一台机器上使用相同可执行文件但在其他机器上没有此问题的任何其他人,请检查您的共享库,确保版本匹配。无论出于何种原因,您的可执行文件可能不喜欢给定库的新版本或旧版本。