我有一个简单的批处理程序,适用于2台CentOS 6.6机器(32位机器和64位机器),但不适用于第三台CentOS 6.6机器(64位机器)。那么完全相同的可执行文件如何在2台计算机上运行,但不能在第三台机器上运行?
请注意,我不是在问如何解决这个问题,我问的是同一个确切的可执行文件在3台不同的计算机上的行为方式如何。我实际上有3或4个不同的C程序符合这种行为,但我选择最简单的程序来解决这个问题。我的理论是在3台机器之间的操作系统级别设置不同的东西(可能我忘了安装一些库或设置一些环境变量)。我只需要帮助缩小查看位置,查看操作系统类型的内容。
这可能应该进入serverfault,因为它更像服务器相关的问题,但我担心那里的人会看到我对C程序的引用并让我来这里,所以我将从这里开始。
请注意,valgrind没有帮助。如果是这样的话,我会在我的代码中解决问题,但它没有发现内存问题。当我说它很简单时,我的意思是。它只是从数据库中读取一些记录,按摩它们,然后将它们打印到屏幕上。
感谢您提供的任何帮助。
答案 0 :(得分:0)
通常,堆栈粉碎警告/错误是由缓冲区溢出类型问题引起的。
我不太了解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()是故意溢出堆栈的函数。
使用此方法可以让您快速确定导致堆栈溢出的函数,并允许您在源代码中修复它。
答案 1 :(得分:-1)
好吧,这是一个与操作系统相关的问题,在外围。基本上,当我安装了我需要的共享库时,我安装了错误版本的ODBC库(一个较新的版本,然后我的代码被用来编译)。一旦我正确安装了旧版本,错误就消失了。因此,对于在一台计算机上但在其他计算机上具有相同可执行文件的此问题的任何其他人,请检查您的共享库,确保版本匹配。无论出于何种原因,您的可执行文件可能不喜欢给定库的新版本或旧版本。