40

私は次のようなクラスを持っています:

public class MyService
{
    private MyService(){}
    public static string GetStuff()
    {
        var stuffDid = new MyService();
        return stuffDid.DoStuff();
    }
    private string DoStuff()
    {
        //do stuff
    }
    //other private helpers

}

明らかに私は多くを省略しましたが、それは一般的なシェルです。

今、私はユニットテストを持っています:

[Test]
public void MyTest()
{

    var results = MyService.GetStuff();
}

単体テストにブレークポイントを設定しましたが、resultsデータがあることがわかります。ただし、ブレークポイントは文字通り全体に設定MyServiceしており、中括弧を付けない限り、何もヒットしません。データがあるので理解できないのですがresults、私のreturnステートメントはMyServiceヒットするはずですよね?

私は何かが足りないのですか?私は何かの最も基本的なルールを完全に忘れましたか?どうして何もMyServiceヒットしないのですか?そして、手動でそれに足を踏み入れるとF11、それはただ飛び回って、私が期待するようにすべての行を通過することさえありません。また、手動でステップスルーすると、最初にヒットしたはずのコードをヒットする傾向があります。また、switch切り替えられる値が明確に別のを入力する必要がある場合でも、ステートメントは最初のオプションがデフォルトになっているように見えますcase

MyServiceコンストラクターを作成publicしてすべてのメソッドを削除しようとしましたがstatic、それでも機能しません。

私のテストと「コア」コードは同じソリューションにありますが、プロジェクトは異なります(それぞれTestCore)。他のテストでは、ブレークポイントに到達する問題はありませんCore。特定のテスト(テストしている唯一のテストMyService)でのみ問題が発生します。

PDBファイルを削除し、ソリューションをクリーンアップしました。まだ何もありません。

4

24 に答える 24

61

いくつかのアイデア。

  1. リリースではなくデバッグビルドであることを確認してください
  2. プロジェクトプロパティがオンになっている場合は、最適化をオフにします
  3. Debugger.Break()VSのブレークポイントの代わりにコードに挿入してみてください
  4. ブレークポイントが有効になっていることを確認し([デバッグ]->[ウィンドウ]->[ブレークポイント]ツールバー)、ブレークポイントの記号が点灯している必要があります
  5. アプリケーションを実行します。[デバッグ]->[ウィンドウ]->[モジュール]ウィンドウをロードします。アセンブリをチェックして、シンボルがロードされているかどうかを確認します。そうでない場合は、関連するステータスメッセージが表示される場合があります。

コンピューターの日付を調整しましたか?これは実際にビルドプロセスを台無しにする可能性があります。その場合は、すべてのobj / binフォルダーを手動で削除し、再コンパイルしてください。

于 2012-12-28T19:59:35.960 に答える
11

デバッグしているのは1つのプロジェクトのみであり、両方Testではないためである可能性があります。Core

複数のプロジェクトを一度にデバッグするようにVSを設定できます。これは、次の方法で実行できます。right-click your solution > Properties > Common Properties > StartUp Project

ここで「複数のスタートアッププロジェクト」を設定できます ここに画像の説明を入力してください

Coreとを設定するだけTestで開始できます。これで問題が解決する場合があります。

于 2012-12-31T00:16:21.197 に答える
9

これは、コードカバレッジがオンになっていることに関連していることがわかりました。

オフにすると、問題が修正されました。

以下のリンクをたどると、コードカバレッジを無効にする方法を見つけることができます

コードカバレッジを無効にする

于 2013-02-05T19:48:04.167 に答える
5

「ブレークポイントがヒットしない」という明らかな問題を引き起こした非常に具体的なシナリオがあります。

ここで他の答えはそれについて言及していなかったので、私はそれが同じ問題を抱えている誰かを助ける機会に私のものを追加します。

私の場合、解決策はばかげていたので、私が使用するのと同じくらい多くのLINQを使用すれば、これをもっと早く理解できたはずです。IEnumerableを返すメソッドを実行する場合、その中に含まれるreturnステートメントは実際にはyield returnステートメントであり、そのメソッドを呼び出してもそのメソッドは実行されません。

実際には、またはなどのIEnumerableオブジェクトから別のメソッドを呼び出すと実行されToList()ますCount()。そうして初めてメソッドが実行され、ブレークポイントに到達します。

于 2013-12-22T08:41:29.020 に答える
3

私は最近同じ問題を抱えていて、壁に頭をぶつけていました。

答えはかなりばかげていることがわかりました。どういうわけか、私のテストプロジェクトはメインライブラリプロジェクトと同期していませんでした。テストとライブラリのデバッグバージョンをビルドしていましたが、テストプロジェクトはbin/Releaseフォルダーからライブラリをコピーしました。プロジェクト参照を再作成したところ、すべてが修正されました。

PSそれはさらに奇妙でした。デバッガーはライブラリー関数の内部に入りましたが、どういうわけかその途中で1行スキップしました。

于 2012-12-31T05:53:12.207 に答える
3

デバッガシンボルを使用してアセンブリをビルドしたことを確認してください。

このオプションは「フル」で埋める必要があります。

ブレークポイントがヒットしないコードファイルを含むプロジェクトを右クリックします。「プロパティ」を選択します。

プロジェクトのプロパティを開いたら、[ビルド]タブを選択します。「詳細...」に注意してください-タブページの下部にあります。(「出力」グループ内)

このボタンをクリックし、「デバッグ情報」プロパティで「フル」を選択します。これが、ブレークポイントがヒットしない理由になるはずです。Visual Studioは、pdbファイルに保存されている記号を使用して、ブレークポイントの正確な位置を見つけます。これらのファイルが作成されていない場合、ブレークポイントはヒットしません。プロジェクトのファイル構造を整理するために、これらのファイルの作成を無効にした可能性があります。これは、これらのファイルが必要であると私が認識した状況でした。

于 2012-12-24T22:03:48.890 に答える
1

コードは「サービス」を示しており、別のプロセスとして実行されている可能性があります。その場合、アセンブリをロードできるため、ブレークポイントは赤い丸で囲まれますが、別のプロセスで実行されているアセンブリの別のコピーが実際にリクエストを処理しています。

  • 考えられる違反者(サービスをホストしている可能性のあるプロセス)がないか、タスクマネージャーを確認してください。デバッグ中にそれらを強制終了して、呼び出しが失敗したことを確認します。
  • Debugger.Break();を使用してみてください。
  • エントリプロセスとアセンブリ名をログに出力するときに、デバッグログファイルを作成します。非同期アクセスの問題を回避するために、ログが毎回異なるファイルであることを確認してください。
于 2012-12-28T20:42:39.043 に答える
1

DoStuffを静的にする必要があります。

private static string DoStuff()
{
    //do stuff
}
于 2012-12-24T21:16:32.283 に答える
1

これは、pdbファイルがテストサンドボックスで更新されていないようです。

1)デバッグモードになっていることを確認します。

2)pdbファイルの展開アイテムを明示的に含めることはできますか?

  • テストプロジェクトにデバッグポイントをアタッチできるとおっしゃいました。
  • テストプロジェクトでデバッグポイントに到達したら、最新のタイムスタンプを持つpdbファイルがサンドボックスのOutフォルダーに存在することを確認します。

3)1と2が失敗した場合、VisualStudioで再起動が必要になることがあります:)

于 2013-01-03T18:17:54.960 に答える
1
  1. ソリューションをクリーンアップして再構築し、プロジェクトの起動も行います。

  2. 構成プロパティが設定されていることを確認するために、BUILD>ConfigurationManagerをざっと見てください。開発中の場合は、プロジェクトのプロパティを調整する必要がある場合があります->詳細設定をクリック->[出力タブ]でデバッグ情報を「フル」に変更します。

  3. 開発モードでなくても、手順2に従うことができます。

于 2013-09-17T06:33:31.313 に答える
1

私はこれを25のうち1つのプロジェクトで発生させましたが、それらはすべて同じソリューションでした。他のプロジェクトはブレークポイントを尊重しましたが、この1つはそうではありませんでした。プロジェクトをソリューションから削除し(アンロードではなく削除)、プロジェクトへのすべての参照を壊してから、ソリューションに追加し直しました。これでうまくいきました。

それでも問題が解決しない場合は、問題のあるプロジェクトを最初から再作成し、その新しいプロジェクトをソリューションに追加することをお勧めします。

これが純粋な運とは別に機能した理由について私が持っている最も良い説明は、プロジェクトをVSのあるバージョンから別のバージョンに何年にもわたって何度も移行し、おそらくそれらの移行の1つがこの問題を引き起こしたということです。

于 2016-06-16T00:48:53.890 に答える
0

Thread.Sleep(5000)inメソッドを追加して、GetStuffプロセスにアタッチを使用することができます

Visual Studio>ツール>プロセスにアタッチして、その行より下のブレークポイントがヒットするかどうかを確認します。

于 2012-12-31T07:27:54.907 に答える
0

リリースモードの場合は、デバッグモードに切り替えます。

于 2013-01-02T06:05:30.363 に答える
0

Visual Studioには、サービス、特にWindowsサービスをデバッグする明確な方法がないことを経験から知っています。GetStuffにコードを追加して、テキストファイルに出力してみてください。こうすることで、少なくともコードがヒットしていることがわかります。サービスを作成するとき、私はテストのためにこの方法に頼ることがよくあります。

于 2013-01-02T17:25:24.183 に答える
0

私は同様の問題に遭遇しました。私にとっては、ファイルを使用したVS2010からVS2012への移行が不適切であることが判明しました*.testrunconfig。古いものを削除し、新しいものを設定して問題を解決しました。

于 2013-01-02T20:14:44.017 に答える
0

VSは、デバッグ時に使用されるコードとは異なるソースコードを使用して生成された.pdbファイルを使用する場合、説明したとおりに動作します(ブレークポイントにヒットしない、ステップスルー時にヒットするとは思わないコードにヒットする) 。これがあなたのケースであることを保証することはできませんが、同じファイル名の古い/異なるコードに対して生成されたビルド済みライブラリとして提供されたコードにステップインする必要があるときに、このような動作を何度も観察しました/シンボル。

于 2013-01-02T20:54:24.673 に答える
0

たぶんあなたのプロジェクトは(ソースコード)プロジェクトではなくTest、古いバイナリを参照していますか?CoreCore

テストプロジェクトに参照を再度追加してみてください。

プロジェクトに移動し、Testプロジェクトへの参照を削除しますCore

次に、Referencesフォルダーを選択して右クリックし、メニューオプションを選択して新しい参照を追加します。[参照マネージャー]ダイアログで、左側を選択していることを確認してくださいSolutionProjects次に、[参照マネージャー]ダイアログの中央で、Coreプロジェクトを選択(チェック)します。

デバッグを再試行して、それが役立つかどうかを確認してください。

于 2013-01-02T23:21:27.317 に答える
0

試してみるべきいくつかのこと:

  • ロードされたシンボルがデバッグされた実行可能ファイルと一致するかどうかを確認します
    。VSコマンドプロンプトを開き、デバッグする実行可能ファイルが存在するディレクトリにcdします。次に、aを実行しdumpbin /PDBPATH:VERBOSE MyServiceExecutable.exe、出力をスキャンして「PDB年齢の不一致」を探します(参照:http://msdn.microsoft.com/en-us/library/44wx0fef.aspx

  • VS 2012についてはよくわかりませんが、古いバージョンのVSには、プロジェクト内に同じ名前の2つのソースファイルがある場合、それらが異なるフォルダーにある場合でも、間違ったソースファイルが表示されるというバグがありました。したがって、プロジェクトに同じ名前の別のソースファイルが含まれている場合は、それらの1つの名前を変更すると役立つかどうかを確認してください。(更新: VS 2012も影響を受けているようです。)

于 2013-01-03T15:53:37.123 に答える
0

愚かな私は、テストプロジェクトが構築されるように設定されていませんでした:

ここに画像の説明を入力してください

于 2013-10-22T09:09:20.007 に答える
0

これはかなりあいまいです:

ハードドライブ上の同じ物理的な場所を指す異なるアプリプールを持つ2つの仮想ディレクトリがないことを確認してください。開発中、これはテストのために、または誤って発生する可能性があるものです。

技術については100%明確ではありませんが、2つのAppPoolと2つの仮想ディレクトリがあり、物理パスがIIS / Visual Studioで実際にマップされたものではなく、他のアプリプールに何らかの形でマップされたと推測されるため、ブレークポイントにヒットすることはありませんでした。実行中。

于 2014-04-06T08:20:54.617 に答える
0

同じ問題があります。たぶん私の解決策はあなたがあなたの問題を解決するのを助けるでしょう。オプション「Attachto」の「AttachtoProcess」で、値「Avtomatic:Nativecode」を選択します。よろしくお願いします。

画像

于 2014-09-16T15:45:08.427 に答える
0

まず、プロジェクトを右クリックしてプロジェクトを再構築してみてください>再構築それが機能しない場合は、プロジェクトのクリーンアップを試してください(プロジェクトを右クリックして>クリーンアップ)

それがうまくいかなかった場合は、これを確認してください:

Right mouse click your project
select [Properties]
select the [Build] tab
make sure [Define DEBUG constant] and [Define TRACE constant] are checked
Click the [Advanced] button at the bottom of the Build tabpage
Make sure that [Debug Info:] is set to [full]
Click [OK] and rebuild the project ;-)

それがあなたのために働くことを願っています!(ステップ6は.pdbファイルを生成します。これらはデバッグシンボルです)

于 2014-10-23T07:55:27.723 に答える
0

ステップバイステップでデバッグするには、2つのことを行う必要があります。最初にブレークポイントを設定し、次にデバッガーをコードを実行しているプロセスに接続する必要があります。IIS Expressを実行していて、64ビットマシンを使用している場合は、コードを実行しているiisexpress.exeをアタッチする必要があります。Ctrl + Alt + Pを押すと、プロセスへのアタッチウィンドウが表示されます。アタッチ後、コードが一致する場合はブレークポイントに到達する必要があります。

于 2015-01-23T07:56:52.017 に答える
0

単体テストでは、ブレークポイントに到達しておらず、テストを実行していて、テストをデバッグしていないことに気付きました。テストエクスプローラーの上部には、[すべて実行]、[失敗した実行]、[合格した実行]などのオプションがあります。テストを実行しても、ブレークポイントはヒットしません。テストをデバッグするには、テストエクスプローラーでテストまたはテストのグループを右クリックし、[選択したテストのデバッグ]を選択します。

于 2016-01-26T15:56:31.597 に答える