You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C# TCP套接字中针对指定端口设置条件断点?

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:55:16