我有一个.NET服务,其正常的私有工作集大约为80 MB.在最近的负载测试期间,进程达到3.5 GB内存使用量,导致整个机器的物理内存不足(使用4 GB中的3.9),并且在负载测试停止后很长时间内内存未释放.使用任务管理器,我获取了该进程的转储文件并在Visual Studio 2010 SP1中打开它,我可以开始调试它.
我如何诊断内存问题?我有dotTrace Memory 3.x,它是否支持转储文件的内存分析?如果没有,Visual Studio 2010 Premium的内存分析功能是否有帮助(我目前有专业版)?WinDbg可以帮忙吗?
更新:新的Visual Studio 2013 Ultimate现在可以使用转储文件本机诊断内存问题.有关详细信息,请参阅此博客文章.
.net memory-leaks crash-dumps visual-studio-2010 memory-profiling
我想调试一个在启动时立即失败的.NET应用程序(并且没有错误消息或日志存在),但我无法将调试器附加到它,因为该过程几乎在我运行后立即存在.我没有应用程序的源代码,所以我不能做"开始调试".我尝试使用Visual Studio宏来启动进程,附加到它,然后中断,但宏太慢,当它找到进程时,进程已经退出:
Imports System
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Public Module Module1
Sub RunAndAttach()
Try
Dim dbg As Debugger3 = DTE.Debugger
Dim trans As Transport = dbg.Transports.Item("Default")
Dim sysProc As Process = System.Diagnostics.Process.Start(New ProcessStartInfo("C:\Temp\CrashingApp.exe") With {.WorkingDirectory = "C:\Temp"})
Dim proc As EnvDTE90.Process3 = dbg.GetProcesses(trans, "ALLON-PC").Item("CrashingApp.exe")
If (Not sysProc.HasExited) Then
proc.Attach()
proc.Break(False)
Else
MsgBox("Process " + proc.Name + " has already has exited.")
End If
Catch ex As System.Exception
MsgBox(ex.Message)
End Try
End Sub
End Module
Run Code Online (Sandbox Code Playgroud)
有没有办法将调试器附加到新创建的进程,如F5呢?
谢谢!
我有一个带有一些静态属性的静态类.我在静态构造函数中初始化了所有这些,但后来意识到它是浪费的,我应该在需要时懒惰加载每个属性.所以我切换到使用该System.Lazy<T>类型来完成所有脏工作,并告诉它不要使用它的任何线程安全功能,因为在我的情况下执行始终是单线程的.
我最后得到了以下课程:
public static class Queues
{
private static readonly Lazy<Queue> g_Parser = new Lazy<Queue>(() => new Queue(Config.ParserQueueName), false);
private static readonly Lazy<Queue> g_Distributor = new Lazy<Queue>(() => new Queue(Config.DistributorQueueName), false);
private static readonly Lazy<Queue> g_ConsumerAdapter = new Lazy<Queue>(() => new Queue(Config.ConsumerAdaptorQueueName), false);
public static Queue Parser { get { return g_Parser.Value; } }
public static Queue Distributor { get { return g_Distributor.Value; } }
public static Queue ConsumerAdapter { get { return g_ConsumerAdapter.Value; } }
}
Run Code Online (Sandbox Code Playgroud)
在调试时,我注意到了一条我从未见过的消息: …
c# lazy-loading visual-studio-2010 visual-studio visual-studio-debugging
我的应用程序冻结后,我找到了事业的一个线程等待通过创建一个任务Task.Delay()(或TaskEx.Delay()在.NET 4.0中)为它提供了一个计算TimeSpan,由于一个错误,是在一次计算到TimeSpan一个TotalMilliseconds小于或等于-1和大于-2(即在-10000到-19999刻度之间的任何位置,包括在内).
看来,当你通过负TimeSpan即-2毫秒或更低,该方法正确地抛出ArgumentOutOfRangeException,但是当你提供从上述的范围内的负时间跨度,它返回一个Task从未完成(通过设置底层System.Threading.Timer到dueTime-1其中表示无穷大).这意味着在该任务上设置的任何延续都将永远不会执行,并且任何发生在其.Wait()上的不良线程Task将永远被阻止.
Task永远不会有什么可能的用途?有人会期望这样的回报值吗?不应该传递任何负值.Delay(),包括该特殊范围内的值,抛出ArgumentOutOfRangeException?
我正在使用EF 4.3.1 ...刚刚升级到4.4(问题仍然存在),由EF 4.x DbContext Generator生成的数据库优先POCO实体.我有以下数据库名为'Wiki'(用于创建表和数据的SQL脚本在这里):

编辑Wiki文章时,不会更新其记录,而是将新版本作为新记录插入,并使修订计数器递增.在我的数据库中有一位作者"John Doe",它有两篇文章,"文章A"和"文章B",其中文章A有两个版本(1和2),但文章B只有一个版本.

我禁用了延迟加载和代理创建(这里是我使用LINQPad的示例解决方案).我想获得由名字以"John"开头的人创建的文章的最新版本,所以我做了以下查询:
Authors.Where(au => au.Name.StartsWith("John"))
.Select(au => au.Articles.GroupBy(ar => ar.Title)
.Select(g => g.OrderByDescending(ar => ar.Revision)
.FirstOrDefault()))
Run Code Online (Sandbox Code Playgroud)
这会产生错误的结果,并仅检索第一篇文章:

结交查询小的变化,通过更换.FirstOrDefault()与.Take(1)下面的查询结果:
Authors.Where(au => au.Name.StartsWith("John"))
.Select(au => au.Articles.GroupBy(ar => ar.Title)
.Select(g => g.OrderByDescending(ar => ar.Revision)
.Take(1)))
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,此查询产生了正确的结果(尽管有更多嵌套):

我假设EF生成略有不同的SQL查询,一个只返回单个文章的最新版本,另一个返回所有文章的最新版本.两个查询生成的丑陋SQL差别不大(比较:针对.FirstOrDefault()的SQL与针对.Take (1)的SQL相比,但它们都返回正确的结果:
.FirstOrDefault()

.Take(1) (重新排列列顺序以便于比较)

因此,罪魁祸首不是生成的SQL,而是EF对结果的解释.为什么EF将第一个结果解释为单个Article实例,而将第二个结果解释为两个Article实例?为什么第一个查询返回不正确的结果?
编辑:我已经打开了关于Connect 的错误报告.如果您认为解决此问题很重要,请进行投票.
Windows 10和Windows Server 2016引入了SO_REUSE_UNICASTPORT套接字选项.它从.NET 4.6版开始通过ServicePointManager.ReusePort静态属性在.NET中使用.在非常高的负载(许多并发传出请求通过HttpClient)期间,我在.NET应用程序上遇到短暂的端口耗尽,我正在考虑使用此选项来处理它.我知道其他方法来处理这个问题(例如编辑Windows注册表以修改临时端口的最大数量或缩短TIME_WAIT),但我也想完全遵循这个解决方案.
文档ServicePointManager.ReusePort非常小:
将此属性值设置为true会导致来自HttpWebRequest的所有出站TCP连接都使用套接字上的本机套接字选项SO_REUSE_UNICASTPORT.这会导致共享底层传出端口.这对于在短时间内建立大量传出连接并且应用程序可能会耗尽端口的情况非常有用.
查看文档SO_REUSE_UNICASTPORT并未提供任何其他见解:
设置后,允许对需要显式绑定的Winsock API连接函数进行临时端口重用,例如ConnectEx.请注意,具有隐式绑定的连接函数(例如没有显式绑定的连接)默认设置此选项.在两者都可用的平台上使用此选项而不是SO_PORT_SCALABILITY.
我在网上找不到任何关于如何实现这种"短暂端口重用"的解释,它在技术层面上的确切运作方式,以及它如何降低短暂端口耗尽的风险.我可以期待多少改进?使用此功能,如何计算应用程序的新限制?启用此功能是否有任何缺点?
这一切都笼罩在神秘之中,如果有人可以解释这个新机制及其含义,我会喜欢它.
我正在使用Code Contracts和Code Contracts Editor Extensions VS2010加载项.我有一个实现IEnumerable<T>接口的类,我已经为该GetEnumerator()方法实现了一个迭代器块.在它上面,我可以看到以下继承的合同:
![确保结果!= null确保result.Model ==((IEnumerable)this).Model [Pure] public IEnumerator(of IBaseMessage)GetEnumerator(){](https://i.stack.imgur.com/rh39r.png)
我理解第一个和第三个合同要求 - GetEnumerator()必须永远不会返回null,并且它必须永远不会导致副作用.但第二份合同要求意味着什么?这个Model属性IEnumerator<T>是IEnumerable什么?
编辑:正如Damien_The_Unbeliever在他的评论中所指出的那样,合同IEnumerable<T>和IEnumerator<T>位于一个单独的文件,一个合同参考大会.使用Reflector,在这两个接口的合同的反汇编中(完整代码在这里),您可以看到以下内容:
[return: Fresh]
[Escapes(true, false), Pure, GlobalAccess(false)]
public IEnumerator GetEnumerator()
{
IEnumerator enumerator;
Contract.Ensures((bool) (Contract.Result<IEnumerator>() != null), null, "Contract.Result<IEnumerator>() != null");
Contract.Ensures((bool) (Contract.Result<IEnumerator>().Model == this.Model), null, "Contract.Result<IEnumerator>().Model == this.Model");
Contract.Ensures((bool) (Contract.Result<IEnumerator>().CurrentIndex == -1), null, "Contract.Result<IEnumerator>().CurrentIndex == -1");
return enumerator;
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,GetEnumerator()编辑器扩展中没有显示额外的合同:
Contract.Result<IEnumerator>().CurrentIndex == -1
Run Code Online (Sandbox Code Playgroud)
而一些additionaly奥秘(如Fresh …
Async Targeting Pack的发布促使我使用ILSpy来查看那里提供了哪些基于任务的异步模式(TAP)扩展方法(其中一些我自己已经实现了在VS2010中使用).我偶然发现了这个.CancelAfter(TimeSpan)方法CancellationTokenSource(这是.NET 4.0异步目标包中的扩展方法,但它是.NET 4.5中的实例方法),并认为这可能是一种很好的方法来实现各种操作的超时.本地有超时,但支持取消.
但是看看Async Targeting Pack中的实现,似乎如果关联Task完成或取消,则计时器继续运行.
/// <summary>Cancels the <see cref="T:System.Threading.CancellationTokenSource" /> after the specified duration.</summary>
/// <param name="source">The CancellationTokenSource.</param>
/// <param name="dueTime">The due time in milliseconds for the source to be canceled.</param>
public static void CancelAfter(this CancellationTokenSource source, int dueTime)
{
if (source == null)
{
throw new NullReferenceException();
}
if (dueTime < -1)
{
throw new ArgumentOutOfRangeException("dueTime");
}
Timer timer = new Timer(delegate(object …Run Code Online (Sandbox Code Playgroud) 我想验证文件名及其完整路径.我尝试了下面的某些正则表达式,但没有一个正常工作.
^(?:[\w]\:|\\)(\\[a-z_\-\s0-9\.]+)+\.(txt|gif|pdf|doc|docx|xls|xlsx)$
and
^(([a-zA-Z]\:)|(\\))(\\{1}|((\\{1})[^\\]([^/:*?<>""|]*))+)$
etc...
Run Code Online (Sandbox Code Playgroud)
我的要求如下所述:让我们说如果文件名是"c:\ Demo.txt"那么它应该检查每个可能性,就像不应该包含双斜线(c:\\Demo\\demo.text)没有像(c::\Demo\demo.text)那样的额外冒号.应该接受像(\\staging\servers)和其他验证的UNC文件.请帮忙.我真的被困在这里了.
当我尝试使用Webdriver播放在Selenium IDE中运行测试时,我一直收到以下错误.
Caused by: org.openqa.selenium.WebDriverException: Cannot find firefox binary in PATH. Make sure firefox is installed. OS appears to be: VISTA
Build info: version: ’2.32.0?, revision: ’6c40c18?, time: ’2013-04-09 17:22:56?
System info: os.name: ‘Windows 7?, os.arch: ‘amd64?, os.version: ’6.1?, java.version: ’1.6.0_39?
Driver info: driver.version: FirefoxDriver
at org.openqa.selenium.firefox.internal.Executable.(Executable.java:72)
at org.openqa.selenium.firefox.FirefoxBinary.(FirefoxBinary.java:59)
at org.openqa.selenium.firefox.FirefoxBinary.(FirefoxBinary.java:55)
at org.openqa.selenium.firefox.FirefoxDriver.getBinary(FirefoxDriver.java:175)
at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:100)
… 14 more
Run Code Online (Sandbox Code Playgroud)
该错误提到没有在PATH中找到firefox二进制文件.我在路径中更新了Firefox二进制文件,但仍然收到相同的错误消息.测试用例中使用的函数是一个自定义案例和waitforelementpresent.
这是我在路径C:\ Program Files(x86)\ Firefox ESR 17中的变量值
我该如何解决这个问题?
.net ×6
c# ×5
.net-4.0 ×2
.net-4.5 ×2
.net-4.6 ×1
async-await ×1
crash-dumps ×1
dbcontext ×1
debugging ×1
firefox ×1
ienumerable ×1
lazy-loading ×1
memory-leaks ×1
path ×1
regex ×1
selenium-ide ×1
sockets ×1