假设我有一个包含十几个不同模块的项目,它们生成一个结果DLL,我该如何分析它以便我可以识别每个模块/函数所贡献的实际文件大小?我知道在Release版本中可能无法删除大量信息,但是如果我拥有完整的源代码并且可以执行Debug构建怎么样?
另外,如果在某处定义了大的静态变量,有没有办法可以轻松找到它们?
奖金问题:Linux ELF文件怎么样?
我正在尝试在windows azure中获取我的worker角色的跟踪日志,但它不起作用,看不到任何错误.
我已经将我的应用程序配置为使用azure诊断程序,如下所述:https://www.windowsazure.com/en-us/develop/net/common-tasks/diagnostics/
首先,我在我的worker角色的app.config中有这个:
<system.diagnostics>
<trace>
<listeners>
<add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="AzureDiagnostics">
<filter type="" />
</add>
</listeners>
</trace>
</system.diagnostics>
Run Code Online (Sandbox Code Playgroud)
然后,在我的ServiceConfiguration.Cloud.cscfg中,我有这个连接字符串:
<ConfigurationSettings>
<Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="DefaultEndpointsProtocol=https;AccountName=XXXXXXX;AccountKey=XXXXXXXXX" />
...
Run Code Online (Sandbox Code Playgroud)
在我的ServiceDefinition.csdef中我有:
<Import moduleName="Diagnostics" />
Run Code Online (Sandbox Code Playgroud)
最后在WorkerRole.cs的OnStart()方法中我有:
var config = DiagnosticMonitor.GetDefaultInitialConfiguration();
config.Logs.ScheduledTransferPeriod = System.TimeSpan.FromMinutes(1.0);
config.Logs.ScheduledTransferLogLevelFilter = LogLevel.Information;
DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", config);
Run Code Online (Sandbox Code Playgroud)
然后我在Run()方法中做了一些Trace.WriteLine().
这应该是在存储中创建WADLogsTable,但事实并非如此.
当我通过远程桌面连接到我的实例时,我在事件查看器中看不到任何错误,我看到的唯一奇怪的是WaHostBootstrapper日志,我看到DiagnosticsAgent.exe进程启动两次,然后获取状态时进程响应而另一个没有响应,这是日志的一部分:
[00002868:00002872, 2012/11/23, 21:26:30.367, 00100000] <- WapGetEnvironmentVariable=0x800700cb
[00002868:00002872, 2012/11/23, 21:26:30.383, 00100000] <- WapGetEnvironmentVariable=0x800700cb
[00002868:00002872, 2012/11/23, 21:26:30.414, 00040000] Executing Startup Task type=2 rolemodule=Diagnostics cmd="E:\plugins\Diagnostics\DiagnosticsAgent.exe"
[00002868:00002872, 2012/11/23, 21:26:30.414, 00040000] Executing "E:\plugins\Diagnostics\DiagnosticsAgent.exe" . …
Run Code Online (Sandbox Code Playgroud) 我已经下载了Glimpse和Glimpse.ADO扩展,并将其安装在我的测试实例上.
我以为我会捕获已执行的任何sql,但似乎它不会以我们的代码编写方式捕获命令.
using (var conn = new SqlConnection(cString))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "Select count(*) from table";
cmd.CommandType = CommandType.Text;
txtResult2.Text = cmd.ExecuteScalar().ToString();
conn.Close();
}
Run Code Online (Sandbox Code Playgroud)
我可以通过如下所示的sql代码从测试页面提供信息:
var factory =DbProviderFactories.GetFactory(cString.ProviderName);
using (var connection = factory.CreateConnection())
{
connection.ConnectionString = connectionString.ConnectionString;
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = "SELECT COUNT(*) FROM table";
command.CommandType = CommandType.Text;
txtResult1.Text = command.ExecuteScalar().ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我只能使用此dbProviderFactories方法捕获数据,那么我的代码中有太多地方需要更改.
有没有办法让Glimpse.ADO使用System.Data.SqlClient.SqlConnection类?是否有另一个Glimpse扩展适用于此命名空间?
有没有其他方法可以解决这个问题?
我正在使用JMX从远程进程中保存一些诊断信息.查看jconsole中的接口显示返回类型是CompositeData(数据实际上作为CompositeDataSupport返回).我想输出与此对象关联的所有键/值对.
问题是接口似乎有一个"values()"方法,无法获取密钥.我在这里错过了什么吗?还有其他方法可以完成这项任务吗?
谢谢!
假设我有一个方法Foo(),我想测量执行哪种类型的Windows性能计数器应该使用的时间(以毫秒为单位)?
var stopwatch = new Stopwatch();
stopwatch.Start();
Foo();
stopwatch.Stop();
counter.RawValue = stopwatch.TotalMilliseonds;
Run Code Online (Sandbox Code Playgroud)
目前我正在使用NumberOfItems64,但除非执行新操作,否则它会持续计数器的最后一个值.这是可取的吗?或者,一旦操作完成,计数器是否应该变为零?在这种情况下你会选择哪种柜台类型?为什么?
我想每个人都同意,持续构建和持续集成有利于软件产品的质量.早期发现缺陷,因此可以尽快修复.对于需要几分钟的连续构建,通常很容易找到导致缺陷的构建者.但是,对于需要很长时间才能运行的夜间集成测试,这可能是一个挑战.以下是具体情况,我正在寻找最佳解决方案:
那么如何组织团队以便尽早修复这些故障呢?在我看来,应该有人指定诊断缺陷.这应该是早上的第一项任务.如果他需要其他人的专业知识,他们应该随时可用.一旦确定了故障的源(组件,数据库,Web服务),所有者就应该开始修复它(或者应该通知另一个团队).
如何指定诊断缺陷的人?理想情况下,有人会自愿(哈哈).我担心这种情况不会经常发生.我听说过其他选择 - 无论谁先到办公室,都应该检查每晚构建的结果.如果整个团队都同意的话,这没关系.但是,这会奖励那些迟到的人.我想这个角色应该在团队中轮换.不应接受"我对构建知之甚少"的借口.故障源的诊断应该相当简单.如果不是,则向代码添加更多诊断日志记录应该可以提高对集成测试失败的可见性.
有关这方面的经验或改进上述方法的建议吗?
我正在尝试记录我的C#服务器应用程序中的打开套接字的数量.就像你可以从"netstat -s"获得的信息:
TCP Statistics for IPv4
Active Opens = 22765
Passive Opens = 9316
Run Code Online (Sandbox Code Playgroud)
我可以解析"netstat"中的结果..但如果有一个类,那么我为什么要...
顺便说一下,在System.Diagnostics.Process类的帮助下,我可以记录一些句柄和线程.我认为套接字是一个句柄,但似乎不是..在我的情况下,句柄的数量低于netstat的活动连接数.
任何建议,建议或答案将不胜感激.谢谢 :)
我在Azure上运行了一个应用程序,它可以将(跟踪,实际)日志记录到Azure诊断存储中.我正在寻找一个可以用来分析这些日志的好工具.
我知道可以使用Visual Studio中的服务器资源管理器检索这些跟踪日志,但此工具有点麻烦.例如,我无法指定日志记录的时间间隔.
还试用了Cerebrata的Azure诊断管理器,这很不错,但是想知道是否有其他好的选择?
(日志记录本身工作正常,它是我感兴趣的日志的检索和分析)
我正在将诊断库中的一些非常旧的代码刷新为现代 C++,但仍然有一段代码一直困扰着我。这是一种非常常见的作用域日志记录函数,它使用宏来定义应用程序特定槽中日志记录数据的存储,这里简化为 int,并带有一个可选版本,该版本采用一个条件来决定是否计时应该发生(例如,对于特定情况,例如第一次通过循环,或者在极端的人工外部计时压力下)。
class ScopedTimer
{
int mSlot;
bool mCondition;
Ticker mBeginTimer;
public:
ScopedTimer( int slot, bool condition ) :
mSlot( slot ),
mCondition(condition)
{
if ( mCondition ) mBeginTimer = GetTimer();
}
~ScopedTimer()
{
if (mCondition)
{
StoreInSlot( mSlot, GetTimer() - mBeginTimer );
}
}
};
#ifdef PROFILING_ENABLED
#define ST_NAME_CONCAT( x, y ) x ## _ ## y
#define ST_NAME_EVALUATOR( x, y ) ST_NAME_CONCAT( x, y )
#define ST_NAME( prefix ) ST_NAME_EVALUATOR( prefix, __LINE__ )
#define SCOPED_TIMER(slot) ScopedTimer ST_NAME(scopedTimer)( …
Run Code Online (Sandbox Code Playgroud)