Использование GDB для просмотра исходных кодов OpenFOAM

Я новичок, использующий OpenFOAM-6. Я пытаюсь прочитать исходные коды по GDB. Однако я не могу понять, почему GDB не может войти в конструктор некоторых классов, таких как fvMesh, Также GDB сообщает что-то вроде

(gdb) p mesh
$1 = <incomplete type>

Я сначала скомпилировал приложение rhoSimpleFoam в режиме отладки. В основном я экспортирую переменную WM_COMPILE_OPTION из опции Отладка, а затем скомпилируйте приложение. Я также попытался собрать всю связку OpenFOAM в режиме отладки. Не влияет на то, что я опишу ниже. Режим отладки rhoSimpleFoam 3,8 МБ, а версия Opt — 889 КБ.

Затем я использую GDB для запуска rhoSimpleFoam от

gdb <ThePathToDebugMode>/rhoSimpleFoam

rhoSimpleFoam.C как следует,

#include "fvCFD.H"#include "fluidThermo.H"#include "turbulentFluidThermoModel.H"#include "simpleControl.H"#include "pressureControl.H"#include "fvOptions.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

int main(int argc, char *argv[])
{
#include "postProcess.H"
#include "setRootCaseLists.H"#include "createTime.H"#include "createMesh.H"#include "createControl.H"#include "createFields.H"#include "createFieldRefs.H"#include "initContinuityErrs.H"
turbulence->validate();

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

Info<< "\nStarting time loop\n" << endl;

while (simple.loop(runTime))
{
Info<< "Time = " << runTime.timeName() << nl << endl;

// Pressure-velocity SIMPLE corrector
#include "UEqn.H"#include "EEqn.H"
if (simple.consistent())
{
#include "pcEqn.H"}
else
{
#include "pEqn.H"}

turbulence->correct();

runTime.write();

Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"<< "  ClockTime = " << runTime.elapsedClockTime() << " s"<< nl << endl;
}

Info<< "End\n" << endl;

return 0;

Я хочу знать, как fvMesh инициализируется, что должно быть сделано в #include "createMesh.H", Файл createMesh.H как следует,

Foam::Info
<< "Create mesh for time = "<< runTime.timeName() << Foam::nl << Foam::endl;

Foam::fvMesh mesh
(
Foam::IOobject
(
Foam::fvMesh::defaultRegion,
runTime.timeName(),
runTime,
Foam::IOobject::MUST_READ
)
);

Я установил точку останова на Foam::fvMesh mesh в ГБД и бежать туда. Тем не менее, GDB не может войти в конструктор этого fvMesh, Вместо этого GDB вступает в runTime.timeName(), После этого GDB выходит из этого файла createMesh.H, Соответствующий конструктор этого fvMesh как следует,

Foam::fvMesh::fvMesh(const IOobject& io)
:
polyMesh(io),
surfaceInterpolation(*this),
fvSchemes(static_cast<const objectRegistry&>(*this)),
fvSolution(static_cast<const objectRegistry&>(*this)),
data(static_cast<const objectRegistry&>(*this)),
boundary_(*this, boundaryMesh()),
lduPtr_(nullptr),
curTimeIndex_(time().timeIndex()),
VPtr_(nullptr),
V0Ptr_(nullptr),
V00Ptr_(nullptr),
SfPtr_(nullptr),
magSfPtr_(nullptr),
CPtr_(nullptr),
CfPtr_(nullptr),
phiPtr_(nullptr)
{
if (debug)
{
InfoInFunction << "Constructing fvMesh from IOobject" << endl;
}

// Check the existence of the cell volumes and read if present
// and set the storage of V00
if (fileHandler().isFile(time().timePath()/"V0"))
{
V0Ptr_ = new DimensionedField<scalar, volMesh>
(
IOobject
(
"V0",
time().timeName(),
*this,
IOobject::MUST_READ,
IOobject::NO_WRITE,
false
),
*this
);

V00();
}

// Check the existence of the mesh fluxes, read if present and set the
// mesh to be moving
if (fileHandler().isFile(time().timePath()/"meshPhi"))
{
phiPtr_ = new surfaceScalarField
(
IOobject
(
"meshPhi",
time().timeName(),
*this,
IOobject::MUST_READ,
IOobject::NO_WRITE,
false
),
*this
);

// The mesh is now considered moving so the old-time cell volumes
// will be required for the time derivatives so if they haven't been
// read initialise to the current cell volumes
if (!V0Ptr_)
{
V0Ptr_ = new DimensionedField<scalar, volMesh>
(
IOobject
(
"V0",
time().timeName(),
*this,
IOobject::NO_READ,
IOobject::NO_WRITE,
false
),
V()
);
}

moving(true);
}
}

Другая проблема, которую я не могу понять, заключается в следующем. GDB все еще находится в файле createMesh.H, GDB ничего не знает о некоторых переменных, как в следующем выводе.

(gdb) p runTime
$1 = <incomplete type>
(gdb) p runTime.timeName()
Couldn't find method Foam::Time::timeName

На самом деле, я использую info sources в GDB показать загруженные символы. Для ссылок на info sources, Проверь это страница интернета. Символы уже загружены.

Похоже, GDB действительно немного знает об OpenFOAM. GDB не может входить в тело функции в некоторых классах OpenFOAM. GDB также не может найти некоторые методы в OpenFOAM.

Кто-нибудь может помочь мне понять, что происходит? Спасибо!

Jingchang

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]