Почему Мини-дампы не дают хорошие стеки вызовов?

if( (p2.x-p1.x)*(p3.y-p1.y) > (p3.x-p1.x)*(p2.y-p1.y) )
    swap( &p1, &p3 );

'>' мог бы стоять перед неправильным путем, но Вы получаете идею.

17
задан Tod 12 October 2009 в 04:55
поделиться

3 ответа

Отключите оптимизацию указателя кадра, если вам нужны дампы стека. Указатели кадров используются для явного определения стека кадров. Без них отладчик должен определить местоположение каждого кадра.

4
ответ дан 30 November 2019 в 11:52
поделиться

Чего не хватает в вашем стеке вызовов? У вас есть несколько адресов, которые не разрешаются в допустимые имена функций (например, 0x8732ae00 вместо CFoo: Bar ())? Если это так, то вам нужно разместить свои .PDB там, где ваш отладчик может их найти, или настроить сервер символов и установить «Пути символов» в контекстном меню, вызываемом правой кнопкой мыши на панели модулей. .

Мы сохраняем каждый .PDB из каждого двоичного файла каждый раз, когда кто-то регистрирует новый список изменений Perforce, так что, когда дамп возвращается от кого-либо в офисе или от любого покупателя в розницу, у нас есть .PDB, соответствующий версии игры, которую они использовали. С установленным сервером символов и путями все, что мне нужно сделать, это просто дважды щелкнуть .mdmp, и он будет работать каждый раз.

Или у вас есть стек вызовов, в котором есть только одна функция? Например, 0x8538cf00 без чего-либо другого в стеке? Если это так, то ваш сбой на самом деле является повреждением самого стека. Если адреса возврата в backchain были перезаписаны, естественно, отладчик не сможет их разрешить.

Иногда вы также обнаруживаете, что поток, который на самом деле генерирует минидамп, не является тем, который сгенерировал исключение, вызвавшее сбой . Посмотрите в окне потоков, чтобы увидеть, есть ли в одном из других потоков неправильный код.

Если вы отлаживаете сборку «Release», то есть сборку, скомпилированную со всеми включенными флагами оптимизации, вам придется смириться с тем фактом, что отладчику будет сложно найти локальные переменные и некоторые другие данные. . Это связано с тем, что включение оптимизации означает разрешение компилятору хранить данные в регистрах, свертывания вычислений и, как правило, выполнять различные действия, предотвращающие фактическую запись данных в стек. Если это ваша проблема, вам нужно открыть окно дизассемблирования и вручную просмотреть данные или перестроить двоичный файл отладки и воспроизвести проблему там, где вы сможете ее увидеть.

один скомпилирован со всеми включенными флагами оптимизации - вам придется смириться с тем фактом, что отладчику будет сложно найти локальные переменные и некоторые другие данные. Это связано с тем, что включение оптимизации означает разрешение компилятору хранить данные в регистрах, свертывать вычисления и, как правило, выполнять различные действия, предотвращающие фактическую запись данных в стек. Если это ваша проблема, вам нужно открыть окно дизассемблирования и вручную просмотреть данные или пересобрать двоичный файл отладки и воспроизвести проблему там, где вы можете ее увидеть.

один скомпилирован со всеми включенными флагами оптимизации - вам придется смириться с тем фактом, что отладчику будет сложно найти локальные переменные и некоторые другие данные. Это связано с тем, что включение оптимизации означает разрешение компилятору хранить данные в регистрах, свертывать вычисления и, как правило, выполнять различные действия, предотвращающие фактическую запись данных в стек. Если это ваша проблема, вам нужно открыть окно дизассемблирования и вручную просмотреть данные или пересобрать двоичный файл отладки и воспроизвести проблему там, где вы можете ее увидеть.

6
ответ дан 30 November 2019 в 11:52
поделиться

Я не использую минидампы, а просто выгружаю стек "вручную" в файл журнала (см. www.ddj.com/cpp/185300443 и Как записывать кадры стека в Windows x64 ).

Я сталкиваюсь с аналогичным поведением, как и вы: иногда есть действительный стек вызовов, иногда нет. В незначительном количестве случаев стек может быть действительно поврежден. Возможно, в 1/3 всех случаев установленный обработчик исключений вообще не вызывается! Я предполагаю, что это почему-то проблема обработки исключений, структурированных в Windows.

0
ответ дан 30 November 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: