Странное поведение с печатью вектора структур - PullRequest
2 голосов
/ 07 декабря 2011

Я хочу напечатать значения вектора структур в стандартный вывод.

Структура определяется следующим образом:

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;

Следующий код работает для печати:

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);
    }
}

Этот код, однако, не работает:

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);
}

Во втором списке кодов filenumber и return_address всегда равны 0, а имя файла дает мне некоторые загадочные символы.

У кого-нибудь есть идеи, что может вызвать эту проблему?

Ответы [ 2 ]

3 голосов
/ 07 декабря 2011

Ну, скорее всего, только первый появляется для работы. Я подозреваю, что происходит то, что вашему %x для печати адреса фактически передается 64-битный указатель (вы компилируете 64-битный двоичный файл?). Затем, когда вы делаете это в отдельных вызовах, он выглядит нормально и печатает 32 бита из адреса. Когда вы запускаете все это вместе, printf запутывается, потому что вы лгали о количестве места, используемого каждым участником.

g ++ выдаст предупреждение на -Wall, если вы попытаетесь это сделать.

C ++ способ решить эту проблему - использовать iostreams. Тип-безопасный и легкий.

Если вам нужен путь C с printf, вы, вероятно, захотите использовать вместо него %lx, и убедитесь, что вы указали свой указатель на long, чтобы тип всегда выравнивался.

1 голос
/ 07 декабря 2011

Не видя определения структуры CS и не зная о вашем компиляторе C ++ и настройках ABI, трудно сказать наверняка.

Но наиболее вероятное объяснение состоит в том, что у вас есть проблема с размером.Например, я подозреваю, что itr->base_address является 64-битной переменной, но %08x ожидает 32-битную переменную.Вы, вероятно, должны использовать %08lx вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...