2015-08-06 2 views
0

У меня есть простая пакетная программа, которая работает на 2 CentOS 6.6 машинах (32-разрядная машина и 64-разрядная машина), но не на третьей машине CentOS 6.6 (64-битная машина). Итак, как может тот же самый исполняемый файл работать на 2 машинах, но не работать на третьей машине?weird «*** обнаружено разбиение стека ***» выпуск

Обратите внимание, что я не спрашиваю, как исправить эту проблему, я спрашиваю, как один и тот же точный исполняемый файл может вести себя по-разному на трех разных машинах. У меня на самом деле есть 3 или четыре разных C-программы, которые соответствуют этому поведению, но я выбираю простейший для устранения этой проблемы. Моя теория заключается в том, что что-то настраивается по-разному на уровне ОС между тремя машинами (возможно, я забыл установить какую-либо библиотеку или установить некоторую переменную окружения). Я просто нуждаюсь в помощи, сужающейся, где искать, какие вещи типа ОС смотреть.

Это, вероятно, должно идти на serverfault, так как это вопрос, связанный с сервером, но я боялся, что люди там будут видеть мою ссылку на программы на C и попросят меня приехать сюда, поэтому я собираюсь начать здесь.

Обратите внимание, что valgrind не помогает. Я бы просто исправить проблему в моем коде, если это так, но не выявило проблем с памятью. Когда я говорю, что это просто, я имею в виду. Он просто считывает некоторые записи из базы данных, массирует их, а затем печатает их на экране.

Спасибо за любую помощь, которую вы можете предоставить.

ответ

0

Хорошо, это была проблема, связанная с ОС, по периферии. В основном, когда я был установлен мои необходимые общие библиотеки, я установил неправильную версию моей ODBC-библиотеки (более новая версия, тогда мой код используется и был скомпилирован). Как только я установил устаревшую версию, ошибка исчезла. Поэтому для тех, кто имеет эту проблему с одним и тем же исполняемым файлом на одном компьютере, но не с другими машинами, проверьте свои общие библиотеки, убедившись, что версии совпадают. По какой-либо причине вашему исполняемому файлу может не нравиться более новая или более старая версия данной библиотеки.

0

Как правило, ошибки разбиения стека или ошибки вызваны проблемами типа переполнения буфера.

Я не знаю достаточно о CentOS/Linux, чтобы узнать, как именно он настроен (мой основной опыт с этим типом проблемы при работе на OpenBSD). Обычно функция обнаружения разбивки стека включена во время компиляции.

GDB может помочь здесь, если вы скомпилируете свою программу с включенными символами отладки (-g) и загрузите полученный файл ядра, чтобы посмотреть на обратную трассировку.

Так, например, в простой программе испытаний на 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() это функция, которая преднамеренно переполнение стека.

Использование этого метода должно позволить вам быстро определить, какая функция вызывает переполнение стека, и позволяет исправить ее в исходном коде.

+0

Да, я видел очень похожие ответы по всему Google. Мой вопрос в том, почему одна и та же программа отлично работает на одном компьютере, но не на другом, когда версии ОС настолько похожи. Существует разница в уровне ОС. Это проблема. Я просто не знаю, как его найти. – user3329922

+0

Я в основном отвечал на последнюю часть: «Я бы просто исправить проблему в моем коде, если бы это было так, но в ней не было проблем с памятью». Использование этого метода поможет найти проблему, позволяющую вам ее исправить. – n1000