2008-12-22 1 views
0

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

Поскольку приложение поддерживает также окна, мы проверили с очисткой на окнах. В приложении нет утечек памяти, и он отлично работает в окнах.

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

ответ

0

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

1

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

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

0

Я использую компилятор 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; 
1

Строка ниже выглядит неправильно меня

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

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

stringstream ss; 
ss << ":BIND" << ns; 
string sLabel = ss.str(); 
+0

": BIND" + ns означает "ns" байты перед началом ": BIND". Когда ns> 6, это помещает вас в лалу. Однако не уверен в ns> 2. – Arkadiy