さびぬきのネタ

Rubyをよく使います。最近はC#もやや使います。C言語も少し使います。Reactは勉強中です。

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では下記の手順で環境変数を設定してください。

  1. 画面左下のスタートアイコンを右クリックしてシステムを選択する
  2. 詳細設定と検索欄に入力してシステムの詳細設定の表示を選択する
  3. システムのプロパティの詳細設定から環境変数を選択する
  4. ユーザー環境変数の変数に_NO_DEBUG_HEAPを値に1を設定する

Visual Studioを再起動してデバッグしてみると、無事にデバッガを通して不具合が発生しました! めでたし、めでたし。