1
(5) 0x1c6235e1 in ProxyClass::Method_C (this=0xb3a0c8, sendFilePath=...) at ./src/ProxyClass.cpp:112

(6) 0x2c8706c1 in Class1::Method_B (this=0x1fc5a1, profile=0x2c8f2340 "fileProfile1", filePathAndFileName=0x0) at ./src/Class1.cpp:860

(7) 0x2c4ae4c0 in Method_B (profile=0x42c <Address 0x42c out of bounds>, filePathAndFileName=0x0) at ./src/Class1_interface.cpp:310

(8) 0x2c1e5c3c in Method_A (profile=0x42c <Address 0x42c out of bounds>, filename=0x2c601c1c "/tmp/temporaryfile.tmp") at ./src/file.cpp:890

gnugdbでデバッグされた上記のコアファイルスニペットがあります。このコアファイルは、Linuxを実行している組み込みシステムで作成されます。関数呼び出し内の変数を操作することはありません...
私の質問は以下のとおりです。

  1. 8番目のフレームでプロファイルがどのようにAddress 0x42c out of bounds表示されるのでしょうか。9番目のフレームまでプロファイルに変更はありませんが、どうすればそれが意味のあるものになるのでしょうか( "fileSchema")。

  2. filename(char *)に等しいため、組み込みシステムがクラッシュ0x2c601c1cし、パスが8番目のフレーム「/tmp/temporaryfile.tmp」にこのように出力されます。ただし、ここでもファイル名変数を操作せずに、Method_AはMethod_Bを呼び出しますが、charポインターは7番目のフレーム(filePathAndFileName = 0x0)で突然nullになります。その後、システムがクラッシュします。そのchar*ポインタはどのように操作でNULLに変換できますか?

Class1::Method_B次の行が実行されるため、クラッシュは6番目のフレームで発生し"std::string filePath( filePathAndFileName);"ます。null charポインターを文字列に初期化しようとしていますが、クラッシュとAbortシグナル(プログラムはシグナル6、Abortedで終了しました)が発生すると思います。メソッド間のその変数のパス内でそのchar*がnullになるのを回避するにはどうすればよいですか?なぜそれがnullになるのか考えてみてください。

static TUint16 Method_A(char* profile, char* filename)
{
    TUint16 a; //after the call of Method_B,the other part of this method being processed but anyway the code never passes to there because of th crash..
    Method_B(profile,filename);
    ...
    ...
    ...
    return a;
}

unsigned char Method_B_interface(char* profile, char* filePathAndFileName)
{
    unsigned char returnValue = 0;

    if ( callbackObject->Method_B( profile, filePathAndFileName ) )
    {
        returnValue = 1;
    }
    return returnValue;
}

bool Class1::Method_B(char* profile, char* filePathAndFileName)
{
    bool returnValue = true;

    std::string   filePathString( filePathAndFileName );
    std::string   profileString( profile );

    if(profileString == "fileProfile1")
    {
        if(xClass != NULL)
        {
            returnValue = xClass->Method_C(filePathString);
        }
    }
    ...
    ...
    ...
    return returnValue;
}

bool ProxyClass::Method_C(const std::string& exportFilePathAndFileName)
{
    bool returnValue;
    std::string message = "dummy", parameters;

    Serializer::serialize( message, exportFilePathAndFileName );
    proxyRequest->synchCall( message, parameters );

    getResponse(parameters);
    Serializer::deserialize( parameters, returnValue );

    return returnValue;
}
4

0 に答える 0