デバッグしたい 32 ビット Windows Server 2003 マシンに C# Windows サービスがインストールされています。
私が抱えている問題は、ログファイルのエラーメッセージが次のことを教えてくれることです:
System.NullReferenceException: Object reference not set to an instance of an object.
at VideoProcessor.ResetCameraProperties(DataServiceObject dso)
at VideoProcessor.AddServer(DataServiceObject dso)
at VideoProcessor.LoadServers()
at VideoProcessor.Start()
atVideoServerComponent.Connect()
関数 ResetCameraProperties の実際のコードは次のとおりです。
protected void ResetCameraProperties(DataServiceObject dso)
{
// Find the CameraType.
//Type videoCameraType = TypeManager.Instance["XFire.Common.VideoObjects.VideoServer"];
if (_videoCameraType == null) return;
//Load cameras from the Data Service Layer
string whereClause = "ServerID = ?";
object[] args = new object[] { dso["ObjectID"] };
IDataServiceCollection videoCameraDsoCollection = ClientServerConnection.Instance.FindCollection(_videoCameraType, whereClause, args, null, CollectionOptions.FilterByPartitionResponsibility) as IDataServiceCollection;
if (videoCameraDsoCollection == null || 0 == videoCameraDsoCollection.Count)
return;
videoCameraDsoCollection.LoadContainerOnEnumeration = false;
foreach (DataServiceObject camera in videoCameraDsoCollection)
{
if (!(bool)dso[RecorderKey.Online] && (int)dso[RecorderKey.VideoServerAlarm] == (int)VideoServerComponent.GetVideoServerAlarm("Offline"))
{
// If the server is disconnected, then we know everything should be offline.
camera[CameraKey.VideoCameraAlarm] = VideoServerComponent.GetEnumValueOfType("XFire.Common.VideoObjectDefinitions.VideoCameraAlarm", "Unknown");
camera[CameraKey.Videoloss] = true;
}
else if ((bool)dso[RecorderKey.Online] && (int)dso[RecorderKey.VideoServerAlarm] == (int)VideoServerComponent.GetVideoServerAlarm("Online"))
{
camera[CameraKey.VideoCameraAlarm] = VideoServerComponent.GetEnumValueOfType("XFire.Common.VideoObjectDefinitions.VideoCameraAlarm", "Normal");
camera[CameraKey.Videoloss] = false;
}
// Save the camera.
ServerResult result = ClientServerConnection.Instance.PersistObject(camera, null);
if (result.Fault != null)
{
if (VideoTrace.TraceError) Trace.WriteLine(result.Fault.Message);
}
}
私はwindbgを開き、File-->Attach to processを実行しました
ここで説明されている手順を使用して、上記の関数にブレークポイントを設定しました: https://docs.microsoft.com/en-us/archive/blogs/alejacma/managed-debugging-with-windbg-preparing-the-environment
ブレークポイントに到達すると、F10 を使用して前に進みますが、表示されるのは次のとおりです。
ブレークポイントの設定: bp 05A0A260 [VideoProcessor.* ResetCameraProperties (XFire.Common.DataServiceLayer.DataServiceObject)] 保留中のブレークポイントを追加しています... 0:024> g DriverWindowsService.OnStop サービスを停止しています... ブレークポイント 0 ヒット eax=00000001 ebx=00902870 ecx= 00a1e020 edx=01066e78 esi=00affb48 edi=01066e78 eip=05a0a260 esp=0674e68c ebp=0674e6b0 iopl=0 nv アップ ei pl nz na po nc cs=001b ss=0023 ds=0023 es=0=0020 gsfl030 fs 00000202 05a0a260 55 プッシュ ebp 0:024> p EAX = 00000001 EBX = 00902870 ECX = 00A1E020 EDX = 01066E78 ESI = 00AFFB48 EDI = 01066E78 EIP = 05A0A261 ESP = 0674E688 EBP = 0674E6E6B0 IEI PL NC C C C NC C C NC C NC C NC C NC C CO FS = 003B GS = 0000 EFL = 00000202 05A0A261 8BEC MOV EBP、ESP 0:024> P eax = 00000001 EBX = 00902870 ECX = 00A1E020 EDX = 01066E78 ESI = 00AFFB48 EDI = 0106E78 EP = 066E78 EP = 068888888888A nv up ei pl nz na po nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202 05a0a263 57 push edi
これは、現時点では何の意味もありません(私はwindbgの初心者です)
Windows サービス用の pdb ファイル (Visual Studio Debug Output フォルダーから取得) があり、それをターゲット マシンのフォルダーC:\Symbolsにコピーしました。
winDbg でFile-->Symbol FIle pathを実行し、コピーしたこの pdb ファイルの場所に設定しました。私のシンボル パスは次のとおりです 。 C:\symcache;C:\Symbols;srv c:\symcache http://msdl.microsoft.com/download/symbols
Windbg でView-->Watchを実行し、上記の関数内にある変数の名前 ( videoCameraType ) を入力しました。しかし、次のエラーが発生しました。
*** 修飾されていないシンボルを指定したか、デバッガに *** *** 完全なシンボル情報がありません。非修飾記号 *** *** 解決はデフォルトでオフになっています。*** *** 完全修飾シンボル module!symbolname を指定するか、「.symopt-100」と入力して非修飾シンボルの解決 *** *** を有効にしてください。*** *** ネットワーク シンボルを使用した非修飾シンボル解決を有効にする *** *** シンボル パス内のサーバー共有により、デバッガーが *** *** 不適切な * ** *** シンボル名が入力されたか、ネットワーク シンボル サーバーがダウンしています。***
*** 一部のコマンドが正しく機能するには、シンボル パス *** *** が完全な型情報を持つ .pdb ファイルを指している必要があります。***
*** 特定の .pdb ファイル (パブリック OS シンボルなど) には *** *** 必要な情報が含まれていません。*** *** が機能するためにこのコマンドが必要な場合は、*** *** がこれらのシンボルを提供したグループに連絡してください。***
*** 参照されるタイプ: _videoCameraType ***
変数を表示して、コードで何が起こっているかを一般的に確認するにはどうすればよいですか???? それが助けになるなら、私はWindowsサービスのソースコードも持っています。
ありがとう