【发布时间】:2015-02-05 14:13:22
【问题描述】:
我不是 C++ 程序员,但尝试调试一些复杂的代码。不是最好的先决条件,我知道...
所以我有一个 openfoam 求解器,它使用(包括)大量代码,我很难真正找到错误。我用
编译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 {更多链接} -I。 -fPIC -c $SOURCE -o Make/linux64Gcc46DPOpt/mySolver.o
在使用适当的选项运行求解器后,它在我的 return 语句之后(或 while)最后崩溃:
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);
}
使用带有setting set environment MALLOC_CHECK_ 2 的gdb 运行求解器会产生:
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 对我来说也不能正常工作。我知道这与一些错误的(取消)分配有关,但我不知道如何真正找到问题。
/编辑
我还没有找到我的问题...
我认为我在上面发布的回溯(位置 #8)表明问题出在编译为 libTMP.so 的代码中。在 Make/options 文件中,我添加了选项 -DFULLDEBUG -g -O0。我当时认为可以跟踪该错误,但我不知道如何。
非常感谢任何帮助!
【问题讨论】:
-
如果你正在使用 new/new[] 你是在调用 delete/delete[] 吗?
-
跟踪表明损坏发生在
Foam::word类型的全局对象的 d'tor 中。我会寻找那些被声明、定义或(错误)使用的地方。 -
有人正在占用
std::string的内部缓冲区(Foam::string和Foam::word也使用它,并通过char*在其上调用delete或delete[].std::string管理自己的buffer,所以delete[]是不正确的,当std::string被销毁时,它也尝试清理它的buffer,但是发现是别人先做的,问题早在清理之前就出现了std::string,它会通知您出现问题。这很好,因为如果运气不好,可能会发生更糟糕的事情它不会注意到它们发生。 -
使用
g++ -Wall -Wextra -g编译,然后使用valgrind 和gdb调试器 -
@ForceBru:你可以
return一个带括号的表达式(即使括号没用)。