小编rb_*_*rb_的帖子

Windows C#执行linux dd命令

我正在编写一个C#.Net应用程序,在需要拍摄可移动磁盘映像并将其放入Linux Live USB的Windows上运行.Live USB插入到目标机器并启动,启动时它会运行一个脚本,该脚本使用dd命令将其闪存到另一个驱动器上:

dd if =/path/to/file/from/csharp/program of =/dev/sdX

我遇到的问题是在Windows端创建图像.我已经使用dd在Linux系统上创建的文件尝试了我的Live Linux,并且工作正常,但我需要能够在Windows上的C#.Net应用程序中创建这些文件.我宁愿不必依赖cygwin或其他依赖,所以试图使用Win32 CreateFile函数打开物理设备.

调用CreateFile时,第一个arg设置为"\.\ F:"(如果F:是我要映像的驱动器),如下所示:

SafeFileHandle TheDevice = CreateFile(_DevicePath, (uint)FileAccess.Read, (uint)(FileShare.Write | FileShare.Read | FileShare.Delete), IntPtr.Zero, (uint)FileMode.Open, (uint)FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_SEQUENTIAL_SCAN, IntPtr.Zero);
if (TheDevice.IsInvalid) 
{ 
    throw new IOException("Unable to access drive. Win32 Error Code " + Marshal.GetLastWin32Error()); 
}
FileStream Dest = System.IO.File.Open(_SaveFile, FileMode.Create);
FileStream Src = new FileStream(TheDevice, FileAccess.Read);
Src.CopyTo(Dest);
Dest.Flush();
Src.Close();
Dest.Close();
Run Code Online (Sandbox Code Playgroud)

但是当使用Live Linux USB将输出文件重新打印到磁盘上时,结果并不像预期的那样(磁盘不可启动等,但是通过在十六进制编辑器中检查输出文件,看起来有一个MBR一开始等).

这是endianess的问题,还是我应该使用FileStream以外的东西将数据复制到文件中.

另外还有一个用于Windows源代码的dd示例(C#或C++,我已经查看了Delphi for http://www.chrysocome.net/dd并且没有完全理解它或者有一个像样的Delphi IDE来选择代码除了)所以我可以看到它是如何工作的?

UPDATE /编辑:

这是dd输出包含的前512个字节的十六进制字符串:

33 C0 FA 8E D8 8E D0 …
Run Code Online (Sandbox Code Playgroud)

c# wmi winapi diskimage dd

9
推荐指数
1
解决办法
3151
查看次数

"私有数据"在VMMAP中定义了什么?

我正在使用VMMap来分析混合模式(托管和非托管)应用程序中的虚拟/进程地址空间利用率.我了解Windows VMM和虚拟内存API的工作原理,我也了解堆内存API的工作原理.我已经看过我正在使用的CRT实现(不是非常详细)和(我想我 - 这可能是我的堕落)了解它如何使用前面提到的Win32 API.

我想了解这个"私人数据"统计数据给我看的内容.我的应用程序不直接调用任何Win32内存API函数,它只在本机C++中使用"malloc/new",在C#中使用"new"(深入使用Win32内存管理API).

VMMap给出的"私有数据"的定义是:

私有内存是由VirtualAlloc分配的内存,不是由堆管理器或.NET运行时子分配的.它不能与其他进程共享,根据系统提交限制收费,并且通常包含应用程序数据.

所以我想这个定义让我问,好吧,那么谁在调用VirtualAlloc呢?它是堆管理器还是.Net运行时?

我可以得到一些已提交的私有数据的地址,并使用WinDbg找出....嗯......事实证明,微软在他们的智慧中扼杀了ntdll公共符号,所以WinDbg不能很好地工作 - 我如果需要,可以提供更多关于此的详细信息,但基本上命令如!address -summary由于缺少符号而不再起作用.

提出这个问题的另一种方法可能是:我可以编写哪些C++或C#代码会导致此私有数据统计数据增加或减少?或者这一切都是由操作系统,C++运行时或.Net运行时管理的,因此受到它的突发奇想?

我可以从VMMap的性质(其他内存类型是唯一的其他内容)推断出这个"私有数据",因此不能是以下任何类型的地址空间:

  • 堆(请注意,这包括已提交的和保留的堆空间 - 通过调用VirtualAlloc保留,如上面的私有数据描述中所述).
  • 管理堆
  • 可共享
  • 映射文件
  • 图片
  • 页表
  • 不可用
  • 自由

(我找不到一个在线帮助文​​件,它定义了VMMap认为上述所有类型的内容,但是这里有一个下载帮助文件的链接:https://technet.microsoft.com/en-us/library/dd535533.aspx)

我注意到在我的应用程序中,私有数据的TOTAL(保留和提交)大小在我的应用程序生命周期内保持相当稳定,尽管堆/管理堆/堆栈大小按预期更改.我还注意到私有数据使用的总量约为250Mb,实际上只提交了~33Mb.请注意我的测量方法相当简陋,所以我的每次测量之间的值可能会发生变化而我只是没有看到它(如果我知道这是测量的,我可以使用DebugDiag来抓取过程的转储相关的柜台达到一定的门槛,鸡肉和鸡蛋).

我目前的推测理论是,这个空间被保留用于增长原生(或管理我认为?)堆积,因为它们达到了他们的能力,但我没有任何证据证明这一点.所以它仍然坚定地投机于投机.

在互联网上搜索有关这方面的详细信息可能很痛苦,有许多帖子/文章/博客会混淆事物,使用自我引用定义(Performance Monitor的工作集定义的第一句就是一个很好的例子),不完整或完全错误.许多地方模糊定义或使用不一致的术语(请注意,VMMaps定义字段私有数据,继续将其称为私有内存,可能有点肛门投诉,但含糊不清).

现在我批评互联网的其余部分是为了让事情变得混乱和不正确...如果上面有什么内容没有意义,或者你可以向我展示相反的文档,或者你需要一个更明确的定义,让我知道,我也将自己列入违法者名单!我认为上半部试图向某人解释内存问题,在网上,确保我们都在谈论同样的事情.

最后这个问题:VMMap如何知道给定的内存区域是Thread Stack,具体来说呢?建议我可能永远找不到答案:/

UPDATE/EDIT:我发现通过打开gflags用户堆栈跟踪(gflags -i myapp.exe + ust),你可以增加私有数据的大小,我会假设这是回溯数据库,但是甚至没有gflags ,我仍在努力解决私人数据问题.

c# c++ memory winapi vmmap

8
推荐指数
1
解决办法
2985
查看次数

所有 GUI 线程的 Application.ThreadException 事件

我有一个 WinForms 应用程序,它创建了多个表单,每个表单都在自己的 GUI 线程中(不是主 GUI 线程)。我想为所有这些表单处理未处理的异常事件 (Application.ThreadException) 以处理任何错误。我还想处理来自工作线程的异常 - 这一点似乎工作正常,但我仍然遇到来自 GUI 线程的异常的问题:

程序.cs:

[STAThread]
static void Main()
{
  AttachExceptionHandlers();
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  Application.Run(new Form1());
}
public static void AttachExceptionHandlers()
{
  Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
  Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);      
  AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
  Dispatcher.CurrentDispatcher.UnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(CurrentDispatcher_UnhandledException);
}
Run Code Online (Sandbox Code Playgroud)

Form1.cs:

//GUI Thread Crash
private void button1_Click(object sender, EventArgs e)
{
  object a = null;
  a.ToString();
}
//Worker Thread Crash
private void button2_Click(object sender, EventArgs e)
{
  Thread myThread = new Thread(() => 
  { 
    object a …
Run Code Online (Sandbox Code Playgroud)

c# exception-handling winforms

5
推荐指数
1
解决办法
1124
查看次数

是否可以在创建后调整memory.dmp文件的大小?

我觉得有点懒,问这个,但我似乎无法召唤正确的谷歌查询来找到我的问题的答案.

一点背景.我有一个应用程序,它将监视未处理的异常和崩溃等其他进程.当触发时,此应用程序收集系统信息并使用MiniDumpWriteDump创建memory.dmp文件.

我们现在喜欢这个进程监控应用程序将崩溃数据上传到服务器,但显然memory.dmp文件可能很大,这对于上传来说是不可取的.因此,我们发现当我们创建memory.dmp时,我们可以减小memory.dmp的大小(如果我们不包含那么重要的信息,可能会使memory.dmp无用)或最终不得不上传大量文件.

无论如何,在我们创建了memory.dmp后,它可以被打开,一些初始分析完成(我知道这个位是可能的)并且memory.dmp的任何位被认为是无用的,被删除/删除(和改为更换了memory.dmp的较小副本)?

例如,memory.dmp的"位"是指.删除处理数据或有关卸载模块的信息.请参见MINIDUMP_TYPE枚举

debugging windbg minidumpwritedump

3
推荐指数
1
解决办法
602
查看次数