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

9

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

Все, что у вас есть, - это отчет о сбое, поэтому воспроизвести проблему практически невозможно. Отслеживание следа не дает никаких подсказок о том, почему авария произошла в первую очередь.

Параметры: - Добавить проверку указателя, чтобы предотвратить сбой. Это предотвратит сбой, но вы, вероятно, даже не узнаете, почему это произошло. - пусть летит, надеюсь, что это случится снова со сценарием репро

Допустим, приложение не предназначено для управляемой ракеты или системы автоматического торможения ...

Что бы вы выбрали?

MM01
источник
Если это не повторяется, может быть удобно опубликовать отчет о сбое вместе с соответствующими файлами кода (возможно, на Pastebin.com) на сайте переполнения стека, если вы хотите, чтобы это было решено ...
Тамара Вийсман,
2
@ TomWij: Не думай, что, скорее всего, он закроется как «слишком локализованный»
Naveen,
@ Навин: Может быть ... Я не обычный ТАК посетитель, так что это был комментарий SU-mind.
Тамара Вийсман
1
@ Naveen: слишком локализованный означает слишком региональный, это о географии, а не о специализации проблемы. Но этот вопрос, вероятно, был бы закрыт на SO субъективностью.
Маньеро

Ответы:

7

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

Нэвин
источник
1
Я склоняюсь к этому мнению сам. Меня беспокоит восприятие пользователя. Авария явно выглядит так, будто что-то пошло не так. Однако, если функция получает совершенно неверный расчет, это также будет замечено.
MM01
2
По моему мнению, даже если пользователь может быть раздражен случайным сбоем, он будет очень расстроен, если он даст неправильный результат, поскольку он может остаться незамеченным.
Навин
сбой как можно раньше, он помогает вам найти проблему и помогает пользователю терять меньше данных
Spudd86
также я бы использовал valgrind, чтобы выяснить, что я делаю неправильно (или, по крайней мере, я бы попытался, в любом случае, он мог бы найти некоторые проблемы, которые вы должны исправить), я бы добавил дополнительные утверждения, чтобы попытаться поймать указатель NULL ранее и попросите пользователя попробовать запустить сборку, в которой на какое-то время включены утверждения, чтобы проверить, не удастся ли им раньше
вызвать
3
  1. Как часто происходит сбой? Это происходит только для одного из многих клиентов в каком-то непонятном случае? Каковы последствия (потеря данных, сбой системы)? Если это происходит каждые 1 на миллион случаев, и им просто нужно перезапустить приложение, и данные не будут потеряны, то, вероятно, вам не нужно это исправлять - оставьте это так.

  2. Насколько дорого (деньги и время) добавить утверждения и отправить их всем клиентам (если только часть клиентов получит новую версию, то у остальных может возникнуть проблема с непроверенным нулем)? Каковы шансы найти проблему? Если вы просто ставите случайные проверки в коде, надеясь уловить ошибку, это плохая практика ...

  3. Может ли проблема быть воспроизведена на машине клиента? Можете ли вы получить доступ к этой машине? Это может быть очень ценным

  4. Просмотрите отчеты о сбоях и убедитесь, что предоставленная информация полезна и может помочь вам диагностировать проблему

Виктор Хурдугачи
источник
2

В среде разработки проблема была бы поймана утверждением.

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

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

  • Архивировать аварийный дамп и ссылаться на него в коде с комментарием в строке, в которой произошел сбой,
    это позволяет тому, кто исследует очень похожий аварийный дамп, узнать, что это произошло раньше ...
    [время потрачено: коротко]

  • Дополнительные проверки, регистрация, ... Вы хотите предотвратить это и получить больше информации в следующий раз.
    [потраченное время: среднее]

    В вашем коде произошло нарушение нулевого указателя.

  • Убедитесь, что невозможно вызвать приложение таким образом, чтобы произошло это нарушение.
    [потраченное время: долго]

Тамара Вийсман
источник
1
Этот пост посвящен не столько подходу к решению проблемы, сколько плану действий в гипотетической ситуации (т. Е. В установленные сроки источник проблемы не может быть определен).
MM01
2

В эти дни я отправляю с включенным assert (). Это не стоит больших затрат и может значительно облегчить жизнь в неблагоприятных ситуациях (т. Е. Среда вашего клиента часто более враждебна, чем среда разработки или контроля качества).

Митч Хейл
источник