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





Вы используете g ++? Если да, перекомпилируйте с флагом "-g". Запустите программу в gdb. Когда он выйдет из строя, введите «bt» (для обратной трассировки), и это должно сказать вам, где ваша проблема.
Это не обязательно утечка памяти. Может случиться так, что часть памяти называется после, она свободна.
Однажды мой друг пришел ко мне с фрагментом кода, который отлично работает в Windows, но дает segv в Linux. Оказалось, что иногда память остается действующей после того, как вы освободили ее в Windows (вероятно, в течение короткого периода времени), но сразу же запускал segv в Linux.
Я использую компилятор 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;
Строка ниже кажется мне неправильной
m_BindMap[sLabel] = b; // crashes at this line at when map size
Я предполагаю, что вы пытаетесь добавить число в конец строки. Попробуйте вместо этого
stringstream ss;
ss << ":BIND" << ns;
string sLabel = ss.str();
«: BIND» + ns означает «ns» байтов после начала «: BIND». Когда ns> 6, вы попадаете в страну лала. Однако не уверен в ns> 2.