- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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://learn.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>克DriverWindowsService.OnStop 服务正在停止...断点 0 命中eax=00000001 ebx=00902870 ecx=00a1e020 edx=01066e78 esi=00affb48 edi=01066e78eip=05a0a260 esp=0674e68c ebp=0674e6b0 iopl=0 nv 上 ei pl nz na po nccs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=0000020205a0a260 55 推 ebp0:024> peax=00000001 ebx=00902870 ecx=00a1e020 edx=01066e78 esi=00affb48 edi=01066e78eip=05a0a261 esp=0674e688 ebp=0674e6b0 iopl=0 nv 上 ei pl nz na po nccs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=0000020205a0a261 8bec 移动 ebp,esp0:024> peax=00000001 ebx=00902870 ecx=00a1e020 edx=01066e78 esi=00affb48 edi=01066e78eip=05a0a263 esp=0674e688 ebp=0674e688 iopl=0 nv 上 ei pl nz na po nccs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=0000020205a0a263 57推送edi
目前这对我来说没什么意义(我是一个 Windbg 新手)
我有 Windows 服务的 pdb 文件(从 Visual Studio 调试输出文件夹获取),并将其复制到目标计算机的文件夹 C:\Symbols 中。
在 winDbg 中,我执行了文件-->符号文件路径并将其设置为我复制的 pdb 文件的位置。我的符号路径如下:C:\symcache;C:\Symbols;srvc:\symcache http://msdl.microsoft.com/download/symbols
在 Windbg 中,我执行了View-->Watch,并输入了上述函数内的变量名称 (videoCameraType)。但我收到以下错误:
<小时/><小时/><小时/>*** 您指定了不合格的符号,或者您的调试器 ****** 没有完整的符号信息。不合格符号****** 分辨率默认关闭。请指定 ****** 完全限定的符号模块!符号名称,或启用解析 ****** 通过键入“.symopt- 100”来删除不合格的符号。注意 ****** 使用网络符号启用不合格的符号解析 ****** 服务器共享符号路径可能会导致调试器***当 *** 不正确时,*** 似乎会长时间挂起*** 输入了符号名称或网络符号服务器已关闭。 ***
<小时/>*** 为了使某些命令正常工作,您的符号路径 ****** 必须指向具有完整类型信息的 .pdb 文件。 ***
<小时/>*** 某些 .pdb 文件(例如公共(public)操作系统符号)不 ****** 包含所需的信息。联系 *** 的群组如果您需要此命令,*** 为您提供了这些符号 ****** 工作。 ***
<小时/>*** 引用的类型:_videoCameraType ***
<小时/><小时/>我如何查看变量并大致了解我的代码中发生了什么???我还有 Windows 服务的源代码(如果有帮助的话)。
谢谢
最佳答案
首先,您的符号文件可能与二进制文件不匹配,因为异常堆栈跟踪中没有源文件路径和行号。您提到您从 Visual Studio 调试输出复制了它们,因此我假设您有在 Release 中编译的二进制文件(没有符号)和来自 Debug 的 pdb 文件。这行不通。您需要做的是change the project settings for your service ,重新编译并部署它(现在发布输出文件夹中应该有 pdb、dll 和 exe 文件)。这应该会为您的异常生成更有意义的堆栈跟踪。
现在,第二部分。您需要区分托管环境和 native 环境。在 Windbg 中,您调试的是操作系统所看到的 CLR,因此您不仅调试 C# 应用程序,还调试 CLR 解释器,该解释器将 ILASM(编译的 C# 代码)编译为 native CPU 指令,然后执行它们。因此,您位于 VS 中通常看到的底层(附加托管调试器)。记住这一点,您需要深入了解 CLR 内部结构并尝试找出寄存器中的地址的含义,或者使用某种转换器来为您完成这项繁重的工作。这就是SOS的地方发挥作用。当你设置断点的时候你就已经使用了它。由于您只对了解变量的值感兴趣,因此您需要首先找出 CLR 为您提供的地址。据我所知, _videoCameraType
是一个私有(private)类成员,不是吗?如果是这样,您可以使用 !dso
命令从堆栈中转储托管对象。您应该看到类似于以下输出的内容:
> !dso
OS Thread Id: 0xad8 (0)
RSP/REG Object Name
000000000068E8F0 00000000025f2bc8 Program+Test
000000000068E8F8 00000000025f2be0 System.String test
000000000068E910 00000000025f2bc8 Program+Test
000000000068E918 00000000025f2bc8 Program+Test
其中 Program+Test
将替换为您的类名。然后,您可以使用 !do
命令和 Object
列中的地址转储对象内容:
> !do 00000000025f2bc8
Name: Program+Test
MethodTable: 000007fe58333a08
EEClass: 000007fe584422b8
Size: 24(0x18) bytes
File: D:\temp\Test.exe
Fields:
MT Field Offset Type VT Attr Value Name
000007feb4dcb318 4000001 8 System.String 0 instance 00000000025f2be0 _testVariable
按名称查找类成员,并再次使用 !do
命令,但使用 Value
列中的地址(这适用于引用类型)。在我们的示例中,它将是:
0:000> !do 00000000025f2be0
Name: System.String
MethodTable: 000007feb4dcb318
EEClass: 000007feb4733720
Size: 34(0x22) bytes
File: C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
String: test
Fields:
MT Field Offset Type VT Attr Value Name
000007feb4dce0c8 40000aa 8 System.Int32 1 instance 4 m_stringLength
000007feb4dcc600 40000ab c System.Char 1 instance 74 m_firstChar
000007feb4dcb318 40000ac 18 System.String 0 shared static Empty
>> Domain:Value 000000000074f960:NotInit <<
如果您需要弄清楚局部变量的值是什么,事情会变得更加棘手。您可以尝试使用 !CLRStack -a
,它通常在发布版本中不会显示太多内容。然后,您需要分析生成的程序集 (!U @rip
),以便找出变量的地址(注册表、堆栈)。弄清楚这一点后,使用您找到的地址再次发出 !do
命令。祝调试愉快:)
关于debugging - 如何使用windbg查看c#变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17726879/
Debug.Assert/Debug.Fail 是否自动条件编译#if "DEBUG"?或者它是否更像是没有附加调试器(即使在发行版中)它什么也做不了?如果是这样,将它们留在您的代码中是否会对性能产生
我有一个应用程序,我配置了多个路由,一切正常,直到我配置的最新路由不起作用(显示错误的屏幕)。 我的问题是如何进行调试?没有打印错误日志,我无法找到如何获取有关正在发生的事情的更多日志。我也不知道从哪
我正在 Intellij 中调试代码。我使用 maven 来构建项目,并且在本地 .m2 存储库中有该项目的各种版本。当我开始调试时,Intellij 继续从项目的前一个快照中选择旧版本的代码。如何让
我喜欢在业余时间进行一些 TiVo 黑客事件 - TiVo 使用 Linux 变体和 TCL 。我想在我的 Windows 笔记本电脑上编写 TCL 脚本,测试它们,然后将它们通过 FTP 传输到我的
我有 ASM 代码,它使用循环语法打印 abc 。这是我的代码 ;abc.com .model small .code org 100h start: mov ah, 02h mov
我在 Debugging .net 2.0 Applications 中看到了以下代码 [Conditional("DEBUG")] void AssertTableExists() { #i
在大型项目中哪个更好用,为什么: #if DEBUG public void SetPrivateValue(int value) { ... } #endif 或 [System.D
我似乎无法让调试器运行。调试运行图标变灰,菜单选项丢失。 这只是main的情况,我可以很好地调试单元测试。 类似的问题提到了项目结构,但我看不出有什么不对: $GOPATH/src/foo.bar.c
只是想知道我的浏览器一直询问我是否想在每次点击浏览器链接刷新时停止调试非常烦人,因为这会减慢开发时间。 有没有其他人遇到过这个? 干杯 最佳答案 更新的答案,现在找到根本原因 经过两年看到这个错误时断
我正在尝试包含调试/发布相关编译器标志,例如: set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x -Wall -DUSE_BOOST") set
当我尝试使用 debug.phonegap.com 调试我的phonegap 应用程序时遇到问题。 我把这个视频放在 HTML 文档的头部 在启动应用程序之前,我从 build.phonegap.
GDB 7.0以后,支持反向调试。 生成核心转储时,我可以使用反向调试命令吗? 我怎样才能做到这一点? 最佳答案 你不能。核心文件是某个时间点程序状态的快照。要在该状态下向后移动,您需要程序状态的较早
首先:如果之前有人问过这个问题,我很抱歉。我是一个熟练的谷歌用户,但这确实让我难住了,我找不到任何东西。 我目前正在编写一个小型库,我想对其进行调试。我还希望能够完全关闭调试,并且编译后的代码不应包含
我想在 tomcat 中将级别日志记录设置为 DEBUG,但在控制台中仍然只有 INFO 和 WARN 输出。谁能告诉我哪里出了问题? 我的 C:\tomcat\logging.properties:
我已经开始像这样使用定义类了: internal sealed class Defines { /// /// This constant is set to true iff th
在使用编译器指令时,我不清楚以下两个代码片段中哪一个是正确/首选的,以及为什么。似乎我见过的大多数开发人员和开源项目都使用第一种,但我也看到第二种也经常使用。 #ifdef DEBUG [self d
我遇到错误,无法完成构建。我搜索了 Stackoverflow 和 Github。我已经尝试了很多方法,但我无法修复。请帮忙。 (1) 在 [src/nullnull/debug, src/debug
我刚刚意识到,使用 TFS 部署时,DEBUG 处理器指令仍然有效,有没有办法更改 TFS/Azure 网站或构建定义中的设置,而不是在本地解决方案配置? 我仍然希望本地解决方案保持调试状态,只有部署
我有一段代码在 VS2008,C++ 中以 Debug模式运行。 问题是,当我逐行调试代码时,在代码的一个非常奇怪的地方,它崩溃并说: debug assertion faild. Expressio
我有一个简单的 Xamarin.Forms 项目,我在 Visual Studio 中运行,使用 iphone 模拟器。我在 App.cs 中有以下代码: protected override voi
我是一名优秀的程序员,十分优秀!