Позвольте мне рассказать вам историю о продукте, над которым я работал в 1992 году, и позже, для целей этой истории мы назовем Stackrobat. Мне назначили ошибку, которая вызвала сбой приложения на Mac, но не на Windows, о, и ошибка не была надежно воспроизводимой. QA потребовалась лучшая часть недели, чтобы придумать рецепт, который сработал, может быть, 1 в 10 раз.
Это был ад, выслеживающий основную причину, так как фактический сбой произошел задолго после действия, которое это сделало.
В конце концов, я отследил это, написав собственный профилировщик кода для компилятора. Компилятор с удовольствием вставит вызовы глобальных функций prof_begin () и prof_end (), и вы сможете сами их реализовать. Я написал профилировщик, который взял адрес возврата из стека, нашел инструкцию по созданию фрейма стека, разместил блок в стеке, который представлял локальные объекты для функции, и покрыл их вкусным слоем дерьма, который мог вызвать ошибку шины, если таковая имеется элемент был разыменован.
Это привело к полудюжине ошибок указателей, использованных до инициализации, включая ошибку, которую я искал.
Случилось так, что большую часть времени в стеке имелись значения, которые, очевидно, были бы доброкачественными, если бы они были разыменованы. В других случаях значения приводят к тому, что приложение запускает свою кучу, а приложение вынимается гораздо позже.
Я потратил больше двух недель, пытаясь найти эту ошибку.
Урок: инициализируйте своих местных жителей. Если кто-то поносит производительность, покажите им этот комментарий и скажите, что вам лучше потратить две недели на профилирование кода и устранение узких мест, а не на отслеживание ошибок, подобных этой. Инструменты отладки и средства проверки кучи стали намного лучше с тех пор, как мне пришлось это сделать, но, откровенно говоря, они стали лучше, чтобы компенсировать ошибки из-за плохой практики, подобной этой.
Если вы не работаете в крошечной системе (встроенной и т. Д.), Инициализация локальных систем должна быть почти бесплатной. Инструкции MOVE / LOAD очень и очень быстрые. Сначала напишите код, чтобы он был надежным и понятным. Рефакторинг, чтобы быть вторым.