Как исправить ошибку доступа к памяти

Я работаю над проектом миграции, здесь мы переносим большой набор библиотек C++ с мейнфрейма на Solaris. Мы успешно завершили миграцию, но во время работы приложения в некоторых местах происходит сбой с сообщением «сигнал SEGV (отсутствует сопоставление по адресу сбоя)».

Поскольку приложение также поддерживает Windows, мы проверили с помощью Purify для Windows. В приложении нет утечек памяти и оно отлично работает на windows.

Может ли кто-нибудь предложить, какие могут быть другие причины, которые могут создавать ошибки такого типа. Любые инструменты для отслеживания этого типа ошибок?


person Community    schedule 22.12.2008    source источник


Ответы (4)


Это не обязательно утечка памяти. Может случиться так, что на часть памяти ссылаются после ее освобождения.

Однажды мой друг пришел ко мне с куском кода, который отлично работает в Windows, но дает segv в Linux. Оказалось, что иногда память все еще действительна после того, как вы освободили ее в Windows (вероятно, на короткий период времени), но сразу же сработал segv в Linux.

person PolyThinker    schedule 22.12.2008

Строка ниже кажется мне неправильной

m_BindMap[sLabel] = b;   // crashes at this line at when map size

Я предполагаю, что вы пытаетесь добавить число в конец строки. Попробуйте это вместо

stringstream ss;
ss << ":BIND" << ns;
string sLabel = ss.str();
person hamishmcn    schedule 22.12.2008
comment
:BIND+ns означает ns байтов после начала :BIND. Когда ns › 6, это ставит вас на землю лала. А вот насчет ns › 2 не уверен. - person ; 22.12.2008

Вы используете г++? Если это так, перекомпилируйте с флагом "-g". Запустите программу в gdb. Когда он вылетает, введите «bt» (для обратной трассировки), и это должно сказать вам, в чем ваша проблема.

person eduffy    schedule 22.12.2008

Я использую компилятор CC на Solaris и отладчик dbx. Я знаю стек вызовов, где он падает. Но это аномальная авария.

map<string,CDBBindParam,less<string> >m_BindMap;



CNumString ns(CNumStringTraits(0,2,'0'));
ns = m_BindMap.size();
string sLabel = ":BIND"+ns;
CDBBindParam b(sLabel,val);
**m_BindMap[sLabel] = b;**   // crashes at this line at when map size is more than 2
return sLabel;
person Community    schedule 22.12.2008