Использование GDB для просмотра исходных кодов OpenFOAM - PullRequest
0 голосов
/ 13 декабря 2018

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

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

Сначала я скомпилировал приложение rhoSimpleFoam в режиме отладки.Обычно я экспортирую переменную WM_COMPILE_OPTION из Opt в Debug, а затем компилирую приложение.Я также попытался собрать всю связку 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 и побежал туда.Однако 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.

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

Цзинчан

...