C言語 デバッガの有無でDebugビルドしたモジュールの挙動が変わる
久しぶりに嫌なバグが発生しました。
タイトルの通り、コンパイルしたexeモジュールをVisual Studioのデバッグ機能から実行したときは期待した動作なのに直接exeモジュールを実行した場合に無限ループが発生するバグが発生しました。
DebugビルドしたexeもReleaseビルドしたexeも同じ挙動でバグっていたため、ビルドバージョンの違いで発生している不具合ではなさそうでした。
デバッガを利用しているときに不具合が発生すればデバッグで原因を突き止められるのに、デバッガを利用しているときは不具合が発生しないなんて...😥😥
なぜデバッガの有無で挙動が変わるのか
今回の挙動に関して色々とググってみると、下記リンクのブログ記事を見つけました。 blog.techlab-xe.net
ブログ内の参考記事は残念ながらリンク切れになっていましたが、デバッガの有無で使用するヒープが変わると記載されていました。
_NO_DEBUG_HEAP
を有効にすればヒープ環境を同一にすることができるとのことです。
...🤔
_NO_DEBUG_HEAP
はどこで有効にすればよいの...?
_NO_DEBUG_HEAPの有効化
Visual Studioの設定を確認してもそれらしい設定箇所はなかったので、再びググる。 (諸事情によりVisual Studio 2010を使用しているので、新しいバージョンについては違う方法もあるかもしれません)
見つけました。 みんなの味方、stack overflow。 stackoverflow.com
どうやらWindowsの環境変数に_NO_DEBUG_HEAP
を値1
で登録すると有効にすることができるみたいです。
Windows 10では下記の手順で環境変数を設定してください。
- 画面左下のスタートアイコンを右クリックしてシステムを選択する
- 詳細設定と検索欄に入力してシステムの詳細設定の表示を選択する
- システムのプロパティの詳細設定から環境変数を選択する
- ユーザー環境変数の変数に
_NO_DEBUG_HEAP
を値に1
を設定する
Visual Studioを再起動してデバッグしてみると、無事にデバッガを通して不具合が発生しました! めでたし、めでたし。