2011-12-06 22 views
2

構造体のベクトルの値をstdoutに出力したいとします。で構造体のベクトルを出力する際の異常な動作

for (itr = ces.begin(); itr < ces.end(); ++itr) { 
    printf("%s() called\nBaseaddress: 0x%08x\nReturnaddress: 0x%08x\nInFile:%s (Line: %d)\n\n", itr->symbol_name, itr->base_address, itr->return_address, itr->file_name, itr->line_number); 
} 

void debuglib::StdOutLogger::logg(std::vector<CS> ces) { 
    std::vector<CS>::iterator itr; 
    for (itr = ces.begin(); itr < ces.end(); ++itr) 
    {  
     //printf("%08x", itr->return_address); 
     printf("%s() called\nBaseaddress: 0x%08x\n", itr->symbol_name, itr->base_address); 
     printf("Returnaddress: 0x08%x\n", itr->return_address); 
     printf("In File: %s (Line: %d)\n\n", itr->file_name, itr->line_number); 
    } 
} 

このコードは、しかし、動作しない。

typedef struct CallStackEntry { 
    DWORD64 base_address; 
    DWORD64 return_address; 
    char* file_name; 
    char* symbol_name; 
    DWORD line_number; 

    CallStackEntry(DWORD64 ba, DWORD64 ra, char* f_name, char* s_name, DWORD ln) : 
         base_address(ba), return_address(ra), file_name(new char[strlen(f_name)+1]), symbol_name(new char[strlen(s_name)+1]), line_number(ln) 
    { 
     memcpy(file_name,f_name, strlen(f_name)+1); 
     memcpy(symbol_name,s_name,strlen(s_name)+1); 
    } 

    } CS; 

次のコードは、印刷のために動作します。次のように

構造体が定義されています2番目のコードリスト、filenumberとreturn_addressは常に0で、filenameは私にいくつかの不明瞭な文字を与えます。

この問題の原因は何ですか?

+0

CS **の仕組みを表示できますか? ** filenumer **とは何ですか? –

+0

これはいくつかの非常に良いヒントです! 残念ながら%lxは問題を解決しません。しかし、あなたがすでに言ったような大きさの問題でなければなりません。 – Chris

+1

サイズでした! DWORD64をDWORDに変更しました。しかし、STACKFRAME構造体にはDWORD64が含まれているので、これを64ビットに移植すると、DWORD64で動作するようになると良いでしょう。しかし、私はあなたにとても感謝しています。 – Chris

答えて

3

最初の1つだけではなく、と表示されます。が表示されます。あなたの%xが実際に64ビットのポインタを渡している(実際には64ビットのバイナリをコンパイルしていますか?)というアドレスが表示されている可能性があります。その後、別の呼び出しでそれを行うと、正常に表示され、アドレスから32ビットを出力します。すべてを一緒に実行すると、各メンバーが使用するスペースの量について嘘をついたので、printfは混乱します。

g ++は-Wallでこれを行うと警告します。

これを解決するC++の方法は、iostreamを使用することです。タイプセーフで簡単。

printfでCの方法を使用する場合は、代わりに%lxを使用して、ポインタをlongにキャストして、型が常に並んでいるようにしてください。

1

CS structの定義を見ずに、あなたのC++コンパイラとABI設定について知らなくても、確かに言うのは難しいです。

しかし、おそらくサイズの問題があるという説明があります。たとえば、itr->base_addressは64ビットの変数だと思われますが、%08xは32ビットの変数を必要としています。おそらく%08lxを代わりに使用する必要があります。

+0

%08lxは 'unsigned long int'を期待しているので32ビットと思われます。 –

関連する問題