如何在C# TCP套接字中针对指定端口设置条件断点?
我正在开发一个使用TCP套接字的C#应用,相关代码如下:
using System.Net.Sockets; ... var sock = (Socket)ar.AsyncState; ... if (sock.Connected) ...
我希望在最后一行if (sock.Connected)设置条件断点,当TCP远程端口等于123时触发。为此,我在监视窗口中输入sock并找到端口,添加的监视项为:
((System.Net.IPEndPoint)sock.RemoteEndPoint).Port
于是我将其作为条件断点表达式:
Conditional Expression
Is true
((System.Net.IPEndPoint)sock.RemoteEndPoint).Port == 123
但出现如下错误:
断点错误:断点条件执行失败。条件为'((System.Net.IPEndPoint)sock.RemoteEndPoint).Port == 123'。返回的错误为'评估System.Net.Sockets.Socket.get_RemoteEndPoint()方法时调用了Native方法Interop+Sys.SetAddressFamily(byte*, int, int),此上下文不支持Native方法评估'。点击确定以在此断点处停止。
请问如何针对该值创建条件断点?
解决方法
提前缓存端口值到本地变量
在代码中if (sock.Connected)之前添加一行代码,将端口值存储到本地变量,避免在断点条件中调用触发Native方法的属性:int remotePort = sock.RemoteEndPoint is IPEndPoint endPoint ? endPoint.Port : -1;之后将条件断点的表达式改为
remotePort == 123即可。这种方法稳定且不依赖内部实现。直接访问Socket的私有字段(临时方案)
部分.NET版本中,Socket的RemoteEndPoint属性对应的私有字段是m_RemoteEndPoint,可以尝试在断点条件中直接访问该字段来绕过属性getter的Native调用:((System.Net.IPEndPoint)sock.m_RemoteEndPoint).Port == 123注意:该方法依赖.NET的内部实现细节,不同版本字段名可能变化,仅适合临时调试使用。
使用跟踪点替代条件断点
如果调试器支持跟踪点(Tracepoint),可以设置跟踪点并添加相同的过滤条件,部分场景下跟踪点的评估逻辑可能避开Native方法调用的限制,同时还能选择是否中断执行。
内容的提问来源于stack exchange,提问作者Dominique

