Есть одна техника, которая может быть очень эффективна с такими ошибками, но она будет работать только на подмножестве их, которые имеют несколько характеристик:
- значение искажения должно быть стабильным (т. Е. Как в вашем примере, когда происходит повреждение, оно всегда равно 100) или, по крайней мере, что-то, что можно легко определить в простом выражении
- повреждение должно происходить по определенному адресу в стеке
- значение искажения настолько необычно, что вы не будете поражены множеством ложных срабатываний
Обратите внимание, что второе условие может показаться маловероятным на первый взгляд, поскольку стек может использоваться многими различными способами в зависимости от действий во время выполнения. Однако использование стека обычно довольно детерминировано. Проблема в том, что конкретное расположение стека может использоваться для стольких разных вещей, что проблема действительно в элементе № 3.
В любом случае, если ваша ошибка имеет эти характеристики, вы должны определить адрес стека (или один из них), который будет поврежден, а затем установить точку останова памяти для записи в этот адрес с условием, которое приводит к его разрыву, только если записанное значение является искажающим значением. В Visual Studio это можно сделать, создав «новую точку останова данных ...» в окне точек останова, а затем щелкнув правой кнопкой мыши точку останова, чтобы задать условие.
Если в конечном итоге вы получите слишком много ложных срабатываний, это может помочь сузить область прерывания, оставив ее отключенной до некоторой точки пути выполнения, которая ближе к ошибке (если вы можете определить такое время), или установите достаточно высокий счетчик попаданий, чтобы удалить большинство ложных срабатываний.
Дополнительным осложнением является то, что адрес стека может меняться от запуска к запуску - в этом случае вам нужно будет позаботиться об установке точки останова при каждом запуске (младшие биты адреса должны быть одинаковыми).