- PR -

マルチスレッドのデバッグ方法について

1
投稿者投稿内容
るいるい
常連さん
会議室デビュー日: 2004/08/01
投稿数: 21
投稿日時: 2004-12-30 19:13
現在、ある機能をマルチスレッドで実行するアプリケーションを開発しているのですが、別スレッドのブレークポイントの設定ができず困っています。
class TestClass
{
  static void Main(string[] args)
  {
    TestClass obj = new TestClass();
    Thread thread = new Thread( new ThreadStart(obj.Start));
    thread.Start();
  } 

  public void Start()
  {
    ※ここにブレークポイントを設定したい!
    (略)
  }
}
単に、ブレークポイントを設定するだけではいけないのでしょうか。

実は今回初めてマルチスレッドのアプリケーションを開発することになり、大変苦戦しております。開発環境は、Visual Studio.NET 2003です。非常に愚問かもしれませんが、皆様のお知恵を拝借できれば幸いです。

[ メッセージ編集済み 編集者: るいるい 編集日時 2004-12-30 19:15 ]
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2004-12-31 05:29
南部です。

単にブレークポイントを設定するだけだと思いますが。
提示されているサンプルでブレークポイントの設定はできました。
もちろん、
引用:

    ※ここにブレークポイントを設定したい!
    (略)


は、
Console.WriteLine("ブレークポイント");
みたいな実行にして設定しましたが。
#Releaseじゃないよね?
るいるい
常連さん
会議室デビュー日: 2004/08/01
投稿数: 21
投稿日時: 2004-12-31 15:10
大晦日にもかかわらず、レスを頂き感謝いたします。

実は、サンプルで書き込んだソースは実際はもうちょっと違うんです。
複雑だったので、かなりシンプルに書き直してあります。確かにおっしゃる通り、自分で掲載したこのサンプルソースでは問題なく、ブレークポイントが設定できることを確認しました。大変失礼致しました。

当然、Release モードではなく、Debug モードです。マルチスレッドは初心者ですが、通常のデバッグは慣れているつもりなんですが...。

実はこのアプリケーションは、Windows サービスなので、当然ながらサービスとしてバックエンドで実行しているプロセスに対してアタッチしてデバッグしています。

とりあえず、サービスとしてではなく、コンソールアプリに変更して、再度試してみたいと思います。
また、何かありましたらサポートしていただければ幸いです。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-01-03 18:23
引用:

単に、ブレークポイントを設定するだけではいけないのでしょうか。


単にブレークポイントを設定するだけです。で、なんとなく感なんですが、既に起動しているプロセスをアタッチしてブレークポイントを設定しているんですよね。で、見る限り起動時のイニシャルの箇所にブレークポイントを設定しようとしているっぽいんですけど。もう既にその場所は実行されたあとなのでは?
任意の場所からデバッグを開始したいなら、DebugBreakとか埋め込んどくと便利ですよ。
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
るいるい
常連さん
会議室デビュー日: 2004/08/01
投稿数: 21
投稿日時: 2005-01-03 23:02
確かに、既に起動しているプロセスに対してブレークポイントを設定しています。実は、ブレークポイントを設定するときに、既にそのポイントが実行されてしまい、困っておりました。そこで、恥ずかしながらベタなやり方なのですが、
Thread.Sleep(20000);
などで、一時的にプログラムを停止させ、その間にプロセスにアタッチするというやり方をとっておりました。ですので、既に実行されている事はないと思うのですが。
(正月明けの明日、再度確認します!)

DebugBreakについて、ネットで探していろいろとチャレンジしてみたのですが、なかなかうまく行きません。
ソース中に、
 [System.Runtime.InteropServices.DllImport("kernel32.dll")]
 static extern void DebugBreak();
と埋め込み、これを任意の箇所でこのメソッド呼び出すという方法でしょうか。やり方がよくないんだと思いますが、「問題が発生したため、ThreadTest1.exe を終了します。 ご不便をおかけして申し訳ありません。」というメッセージとともに、終了してしまいます。
お手数なのですが、もう少し具体的な方法をご教授いただければ幸いなのです。

また、Windows サービスのアプリ開発されている皆様は、どのようは方法でデバッグしているのでしょうか。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-01-03 23:11
引用:

るいるいさんの書き込み (2005-01-03 23:02) より:

また、Windows サービスのアプリ開発されている皆様は、どのようは方法でデバッグしているのでしょうか。


 タイマーで1分後にイベントが発生するようにして、メインの処理はそのタイマーイベントに書き込んでいます。

 この間思いついたのですが、メインの処理はプロジェクトを分け、メインの処理、サービス、デバッグ用のプロジェクトの3部構成というのはどうでしょう?
_________________
1

スキルアップ/キャリアアップ(JOB@IT)