Я не программист на C++, но пытаюсь отладить некоторый сложный код. Не лучшие предпосылки, я знаю ...Как отлаживать путаный большой код?
Итак, у меня есть openfoam solver, который использует (включает) много кода, и я изо всех сил пытаюсь найти ошибку. Я компилирую с
SOURCE=mySolver.C ; g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -O3 -DNoRepository -ftemplate-depth-100 -I/opt/software/openfoam/OpenFOAM-2.0.5/src/dynamicMesh/lnInclude {more linking} -I. -fPIC -c $SOURCE -o Make/linux64Gcc46DPOpt/mySolver.o
и после запуска решателя с соответствующими опциями, он выходит из строя в конце после (или во время) мое возвращение заявление:
BEFORE return 0
*** glibc detected *** /opt/software/openfoam/myLibs/applications/bin/linux64Gcc46DPOpt/mySolver: double free or corruption (!prev): 0x000000000d3b7c30 ***
======= Backtrace: =========
/lib64/libc.so.6[0x31c307230f]
/lib64/libc.so.6(cfree+0x4b)[0x31c307276b]
/opt/software/openfoam/ThirdParty-2.0.5/platforms/linux64/gcc-4.5.3/lib64/libstdc++.so.6(_ZNSsD1Ev+0x39)[0x2b34781ffff9]
/opt/software/openfoam/myLibs/applications/bin/linux64Gcc46DPOpt/mySolver(_ZN4Foam6stringD1Ev+0x18)[0x441e2e]
/opt/software/openfoam/myLibs/applications/bin/linux64Gcc46DPOpt/mySolver(_ZN4Foam4wordD2Ev+0x18)[0x442216]
/lib64/libc.so.6(__cxa_finalize+0x8e)[0x31c303368e]
/opt/software/openfoam/myLibs/lib/linux64Gcc46DPOpt/libTMP.so[0x2b347a17f866]
======= Memory map: ========
...
Мой решатель выглядит как (извините, я не могу «т поместить все части):
#include "stuff1.H"
#include "stuff2.H"
int main(int argc, char *argv[])
{
#include "stuff3.H"
#include "stuffn.H"
while (runTime.run())
{
...
}
Info<< "BEFORE return 0\n" << endl;
return(0);
}
Запуск решателя с БГД с settingset environment MALLOC_CHECK_ 2
уступает:
BEFORE return 0
Program received signal SIGABRT, Aborted.
0x00000031c3030265 in raise() from /lib64/libc.so.6
(gdb) bt
#0 0x00000031c3030265 in raise() from /lib64/libc.so.6
#1 0x00000031c3031d10 in abort() from /lib64/libc.so.6
#2 0x00000031c3075ebc in free_check() from /lib64/libc.so.6
#3 0x00000031c30727f1 in free() from /lib64/libc.so.6
#4 0x00002aaab0496ff9 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()()
from /opt/software/openfoam/ThirdParty-2.0.5/platforms/linux64/gcc-4.5.3/lib64/libstdc++.so.6
#5 0x0000000000441e2e in Foam::string::~string (this=0x2aaaac0bd3c8, __in_chrg=<value optimized out>) at /opt/software/openfoam/OpenFOAM-2.0.5/src/OpenFOAM/lnInclude/string.H:78
#6 0x0000000000442216 in Foam::word::~word (this=0x2aaaac0bd3c8, __in_chrg=<value optimized out>) at /opt/software/openfoam/OpenFOAM-2.0.5/src/OpenFOAM/lnInclude/word.H:63
#7 0x00000031c303368e in __cxa_finalize() from /lib64/libc.so.6
#8 0x00002aaab2416866 in __do_global_dtors_aux() from /opt/software/openfoam/myLibs/lib/linux64Gcc46DPOpt/libTMP.so
#9 0x0000000000000000 in ??()
(gdb)
Как мне найти реальный источник моей ошибки?
КПП. Я видел this и this, который похож, но не решает мою проблему. Также valgrind не работает правильно для меня. Я знаю, что это связано с неправильным (де-) распределением, но я не знаю, как действительно найти проблему.
/Edit
Я не смог найти мою проблему еще ...
Я думаю, трассировку, который я отправил выше (позиция # 8) показывает, что проблема в коде, который компилируется до libTMP.so
. В файле Make/options файл Я добавил опцию -DFULLDEBUG -g -O0. Я подумал, что можно отследить ошибку, но я не знаю, как это сделать.
Любая помощь очень ценится!
Если вы используете новый/новый [], вы вызываете delete/delete []? – NathanOliver
@ Nathan solver включает в себя массу других файлов. Я не писал код, поэтому я не хочу искать вручную. Я думаю, что для этой цели есть отладчики. Но как я могу найти проблему (например, отсутствующие операторы удаления)? – EverythingRightPlace
След предполагает, что коррупция происходит в древе глобального объекта типа «Foam :: word». Я бы искал места, где они объявлены, определены или (неправильно) использованы. – user2079303