Запуск программы в 64-битной и 32-битной системах - PullRequest
1 голос
/ 15 июня 2011

Есть ли причина, по которой программа на С ++, которая отлично работает в 64-битной системе, дает сбой в 32-битной системе? У меня есть программа, проверенная на 2 серверах. один 64 бит и другой 32 бит. Программа не имеет специальных битовых команд. Первоначально это работало в обоих, пока я не сделал chage, добавил структуру и назвал это. Программа аварийно завершилась, когда этот структурный объект был вызван впервые. Но если я распечатаю значение элемента 1 строки до его сбоя, значения там есть. Кстати, под значением я подразумеваю целые числа, а не указатели или другие забавные вещи. Я попытался инициировать эти целые числа как uint32_t и такие эксперименты. Но зайти в тупик.

структура такова

struct info {
    int id1, id2;
    string test;
};

map<string, info> allInfo
vector<string> temp;
/* temp populated */

info details = {atoi(temp[0].c_str()),atoi(temp[2].c_str()),temp[3].c_str()};
allInfo[temp[1].c_str()] = details; 

/*somewhere after this it is accessed */

map<string, info>::iterator i;
/* printing the values here seems ok.. */
cout << (*i).second.id1 << endl << (*i).second.id2 << endl;
string first_id = "idOne : " + (*i).second.id1; 
string second_id = "idTwo: " + (*i).second.id2;

Ответы [ 5 ]

0 голосов
/ 15 июня 2011

вы добавляете целые числа к массивам символов в:

string first_id = "idOne : " + (*i).second.id1; 
string second_id = "idTwo: " + (*i).second.id2;

может быть, ваши тестовые наборы различаются, и в не-бросающей системе вы случайно получаете правильный адрес для назначения строковой переменной.

0 голосов
/ 15 июня 2011

Есть несколько вещей, которые могут пойти не так, и без отладчика выяснить это будет кошмаром.

Вариант 1: убедить любого, кто имеет права администратора на сервере, установить gdb.

Вариант 2: везде добавлять операторы печати, чтобы точно определить, какая строка возникает в сообщении segfault (или попытаться выяснить это самостоятельно).

0 голосов
/ 15 июня 2011

Просто предположение.Вы скомпилировали его на / для 64-битных машин?Возможно, там есть какой-то код операции, который недоступен на 32-битных машинах.

0 голосов
/ 15 июня 2011

Так что нет приведения, нет динамического выделения и сбоя в 32-битной сборке, а не в 64-битной сборке.Моим первым предположением будет доступ к массиву за пределами их диапазона.

0 голосов
/ 15 июня 2011

Простая причина - неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...