kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

コンソールアプリケーションをリモートデバッグするとき

GUIアプリケーションだったら起動すれば、ユーザーアクション以外では終了しないのでとても簡単です。起動してからゆうゆう、リモートマシンでデバッガアタッチすればいいのです。
しかしコンソールアプリケーションの場合、ユーザーの応答なんて待たないものも多いです。そりゃそうですよね、一括実行するためのものなんですから。そうなると困るのがリモートデバッグ。OSにVisual Studio入れて普通にデバッグもいいのですが、評価環境には極力余計なものは入れたくありません。せいぜいリモートデバッガまで。
そうなると、コンソールアプリケーションはどこかで入力待ちをする必要があります。簡単なのは特定の環境変数が設定されていればReadConsoleを使用して待つ。

  TCHAR szBuffer[11];
  DWORD dwRead;
  if(GetEnvironmentVariable("_DEBUG_DUMMY", szBuffer, 10) > 0) {
    HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);
    ReadConsole(hConsole, szBuffer, 10, &dwRead, NULL);
    CloseConsole(hConsole);
  }

でもなんかダサいというか、環境変数設定しているの忘れそうです。いや、環境変数設定したコンソールを用意していればいいのですけど。うーん、なんかいい方法ないかな。特定のDLLが同じフォルダに存在していたらDLLのエントリポイント決めておいて、呼び出して止めるとか面白いかな…。