Как я могу гарантировать, что ловля EXCEPTION_STACK_OVERFLOW структурировала исключение в C++ в соответствии с Visual Studio 2005?

systemProperties используются для передачи свойств, которые вы обычно передаете с -D, во время выполнения.

jvmArgs предназначены для передачи аргументов в JVM.

То, что вы хотите использовать, это args вместо одного из вышеперечисленных.

bootRun {
  args = [
    '--spring.config.additional-location=file:C:/demo_class_path/',
    '--server.port=8090'
    ]
}

Важно включить / в конце для spring.config.additional-location. Когда он не заканчивается на /, он интерпретируется как базовое имя файла, а не местоположение файла.

6
задан Aaron 12 January 2009 в 22:10
поделиться

5 ответов

Все до Windows XP не было бы (или быть более твердым) обычно смочь захватить переполнения стека. С появлением xp можно установить векторный обработчик исключений, который получает шанс при переполнении стека до любого стекового (структурированное исключение) обработчики (это - самая причина - структурированные обработчики исключений являются стековыми).

Но существует действительно не очень, можно сделать, даже если Вы можете захватить такое исключение.

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

Надежда, это помогает.

5
ответ дан 9 December 2019 в 22:41
поделиться

Я помню код от предыдущего рабочего места, которое звучало как подобные имеющие явные граничные проверки на указателе вершины стека и выдача исключения вручную.

Это было некоторое время, так как я коснулся C++, хотя, и даже когда я коснулся его, я не знал то, что я делал, таким образом, конструктор протеста о мобильности/надежности упомянутого совета.

1
ответ дан 9 December 2019 в 22:41
поделиться

Я не убежден, что Вы находитесь на правильном пути в диагностировании этого как переполнение стека.

Но в любом случае, то, что Вы добираетесь пуф!, плюс то, что Вы видите в WinDbg

Дамп катастрофического отказа будет только содержать один поток, который является 'Сном () 'луг. Все другие потоки вышли.

намекает мне, что кто-то назвал выход RTL C () функцией или возможно назвал Windows API TerminateProcess () непосредственно. Это могло иметь некоторое отношение к Вашим обработчикам прерываний или нет. Возможно, что-то в логике обработки исключений имеет проверку повторной входимости и произвольно решает выйти (), если она повторно введена.

Мое предложение состоит в том, чтобы исправить Ваши исполняемые файлы для помещения, возможно, отладки INT 3 в точку входа для выхода (), если это статически связано, или если это динамично связано, исправьте импорт и также исправьте любой импорт kernel32:: TerminateProcess для броска DebugBreak () вместо этого.

Конечно, выход () и/или TerminateProcess () можно назвать на нормальном завершении работы также, таким образом, необходимо будет отфильтровать ложные аварийные сигналы, но если можно получить стек вызовов для случая, где это как раз собирается пойти доказательство, Вы должны иметь то, в чем Вы нуждаетесь.

РЕДАКТИРОВАНИЕ ДОБАВЛЯЕТ: Просто запись Вашей собственной версии выхода () и соединение его во вместо версии CRTL могли бы добиться цели.

4
ответ дан 9 December 2019 в 22:41
поделиться

Вы рассмотрели ADPlus от Средств отладки для Windows?

ADPlus присоединяет отладчик CDB к процессу в режиме "катастрофического отказа" и генерирует дампы катастрофического отказа для большинства исключений, которые генерирует процесс. В основном Вы выполняете "ADPlus-p yourPIDhere катастрофического отказа", он выполняет агрессивное присоединение и начинает регистрироваться.

Учитывая Ваш комментарий выше о выполнении под отладчиком, я просто хотел добавить, что CDB включает фактически нулевые издержки - режим катастрофического отказа на достойном (двухъядерный, 2 ГБ RAM) машина, не позволяйте этому сдержать Вас от попытки его.

1
ответ дан 9 December 2019 в 22:41
поделиться

Можно генерировать отладочную информацию, не отключая оптимизацию. На самом деле необходимо делать это так или иначе. Это просто делает отладку тяжелее.

И документация для _set_se_translator говорит, что каждый поток имеет своего собственного переводчика SE. Вы устанавливаете один для каждого потока?

set_unexpected вероятно, не, по крайней мере, согласно документации VS 2005 года. И каждый поток также имеет свое собственное terminate обработчик, таким образом, необходимо установить это на поток также.

Я также настоятельно рекомендовал бы не использовать перевод SE. Это берет аппаратные исключения, которые Вы не должны игнорировать (т.е. необходимо действительно зарегистрировать ошибку и оконечный), и превращает их во что-то, что можно проигнорировать (исключения C++). Если Вы хотите поймать этот вид ошибки, используйте a __try/__except обработчик.

0
ответ дан 9 December 2019 в 22:41
поделиться
Другие вопросы по тегам:

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