怎样才能把一个文件抓出来
Ⅰ 如何手工抓取mp文件
在生产环境下进行故障诊断时,为了不终止正在运行的服务或应用程序,有两种方式可以对正在运行的服务或应用程序的进程进行分析和调试。
首先一种比较直观简洁的方式就是用WinDbg等调试器直接attach到需要调试的进程,调试完毕之后再detach即可。但是这种方式有个缺点就是执行debugger命令时必须先break这个进程,执行完debug命令之后又得赶紧F5让他继续运行,因为被你break住的时候意味着整个进程也已经被你挂袭段起。另外也经常会由于First Chance Excetpion而自动break,你得时刻留意避免长时间break整个进程。所以这样的调试方式对时间是个很大的考验,往往没有充裕的时间来做仔细分析。
另一种方式则是在出现问题的时候,比如CPU持续长时间100%,内存突然暴涨等非正常情况下,通过对服务进程snapshot抓取一个mp文件,完成mp之后先deatch,让进程继续运行。然后用windbg等工具来分析这个抓取到的mp文件。
那么如何在不终止进程的情况下抓取mp文件呢?Debugging Tools for Windows里提供了一个非常好的工具,adplus.vbs。从名字可以看出,实际上是一个vb脚本,只是对cdb调试器作的一个包装脚本。
其路径与Debugging Tools for Windows的安装路径相同,使用的方法也很简单,如下所示:
adplus.vbs -hang -p 1234 -o d:/mp
其中-hang指明使用hang模式,亦型好即在进程运行过程中附加上去snapshot抓取一个mp文件,完成之后detach。与之对应的是-crash崩溃模式,用户先启动adplus,然后由它启动要监控的程序,在出现异常崩溃时自动生成mp文件,或者通过Ctrl-C人为发出抓取指令。但是-crash模式在抓取完成之后,被监控的进程就必须终止。因此我们在这里只选用-hang模式。
-p是要调试的进程ID,比如ASP.NET应用线程池,在Win2003下就是w3wp.exe
-o 指定要output的mp文件路径。
另外,与adplus类似的,有个UserDump工具,但是抓取用户模式的进程,而adplus则是内核模式和用户模式两者皆可。
而总所周至的Dr. Waston,则会在进程崩溃之后的自动时候抓取mp文件,一样可以用于windbg等调试器来事后分析程序崩溃时的状态。
====================
0:000> !mpheap -stat
No export mpheap found
======解决方法:
.load clr20/sos.dll,你要先执行的。sos.dll在默认的c:/windows/microsoft.net/framework/v2.....下面,你复制到c:/program files/debugging tools for windows下面的clr20目录下面(clr20是你手工创建的)
=======================
在.NET下开发时,最拍租誉基本的调试方法就是使用Visual Studio的单步调试。但是对于一些特殊情况,特别是涉及到CLR内部的时候使用这种方式就达不到目的了。
如果要查看运行时内存使用情况,IL代码,CLR信息等可以使用以下两种方式:
1、使用VS2005 + sos.dll
2、使用Windbg + sos.dll
第二种方式功能更加强大,下面我就通过实际操作展示一下怎么使用这种方法得到运行时ArrayList内部的值。
有人可能会说:我直接用Visual Studio的单步调试岂不是更快?当然,这个只是一个演示,通过这个演示是为以后的高级调试打下基础
在操作之前,先熟悉一下基本知识:
A、使用VS2005 + sos.dll调试
1、需要在项目->属性->调试-〉启用非托管代码调试
2、打开调试-〉窗口-〉即时
3、在即时窗口中输入 !load sos 加载调试模块
4、输入其它调试语句
B、使用Windbg + sos.dll
1、去微软的网站下载最新的Windbg
2、打开Windbg在File-〉Symbol File Path ...窗口中输入 srv*c:/symbols*http://msdl.microsoft.com/download/symbols
3、运行需要调试的程序,然后在Windbg中File-〉Attach to Process中选择刚才运行的程序
4、在出现的Command窗口中就可以输入调试语句
5、常用调试语句:
lm //查看加载了哪些模块
.load C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/sos.dll //加载调试模块
ld TestClass //加载调试符号
!name2ee TestClass.exe TestClass.Program.test //显示test方法相关的地址
!mpmt -md 00976d48 //得到类的成员函数详细信息
!mpil 00973028 // 显示这个方法被编译器编译之后的IL代码
!mpheap -stat //该命令显示程序中所有对象的统计信息,显示的大小是对象本身的大小,不包括对象里面值的大小
!mpheap -mt 790fcb30 //该命令显示MethodTable 790fcb30的详细信息
!gcroot 012919b8 //来显示一个实例的所属关系
!mpobj(do) 012a3904 //显示一个对象的具体内容,看对象里面有什么,值是什么
!ObjSize 012a1ba4 //对象实际在内存中的大小
!eeheap -gc //查看托管堆的情况(包括大小)
!DumpArray //查看数组信息
下面就来看看具体的调试步骤:
1、我们的测试代码
namespace TestClass
{
class Program
{
[STAThread]
static void Main(string[] args)
{
ArrayList list = new ArrayList();
list.Add("aaaa");
list.Add("bbbb");
Console.ReadLine();
}
}
}很简单,就是一个ArrayList
运行这个程序(开始执行,不调试),然后进入Windbg,Attach到这个进程
2、查看所有堆栈信息
0:004> !mpheap -stat
MT Count TotalSize Class Name
7910062c 1 12 System.Security.Permissions.SecurityPermission
7918e284 1 16 System.IO.TextReader+SyncTextReader
79102d10 1 20 Microsoft.Win32.SafeHandles.SafeFileMappingHandle
79102cb4 1 20 Microsoft.Win32.SafeHandles.SafeViewOfFileHandle
79101d30 1 20 System.Text.
79100a7c 1 20 Microsoft.Win32.SafeHandles.SafeFileHandle
79105cd4 1 24 System.Collections.ArrayList
......
7912ad90 11 9036 System.Object[]
790fcb30 2083 131492 System.String
Total 2202 objects
除了我们的ArrayList外,还有很多其它的系统信息,先不用管它
3、查看我们的ArrayList的信息
0:004> !mpheap -mt 79105cd4
Address MT Size
012a1b88 79105cd4 24
total 1 objects
Statistics:
MT Count TotalSize Class Name
79105cd4 1 24 System.Collections.ArrayList
Total 1 objects
4、查看对应地址内部实际的值
0:004> !do 012a1b88
Name: System.Collections.ArrayList
MethodTable: 79105cd4
EEClass: 79105c28
Size: 24(0x18) bytes
(C:/WINDOWS/assembly/GAC_32/mscorlib/2.0.0.0__b77a5c561934e089/mscorlib.dll)
Fields:
MT Field Offset Type VT Attr Value Name
7912ad90 40008df 4 System.Object[] 0 instance 012a1bb0 _items
791018e0 40008e0 c System.Int32 1 instance 2 _size
791018e0 40008e1 10 System.Int32 1 instance 2 _version
790fc35c 40008e2 8 System.Object 0 instance 00000000 _syncRoot
7912ad90 40008e3 1c0 System.Object[] 0 shared static emptyArray
>> Domain:Value 00149c58:012a1ba0 <<
可以看到ArrayList的大小为2,具体的值保存在地址012a1bb0中,是一个System.Object[]类型的数组
5、查看数组信息
0:004> !DumpArray 012a1bb0
Name: System.Object[]
MethodTable: 7912ad90
EEClass: 7912b304
Size: 32(0x20) bytes
Array: Rank 1, Number of elements 4, Type CLASS
Element Methodtable: 790fc35c
[0] 012a1b50
[1] 012a1b6c
[2] null
[3] null
6、查看数组内对象的值
0:004> !do 012a1b50
Name: System.String
MethodTable: 790fcb30
EEClass: 790fca90
Size: 26(0x1a) bytes
(C:/WINDOWS/assembly/GAC_32/mscorlib/2.0.0.0__b77a5c561934e089/mscorlib.dll)
String: aaaa
Fields:
MT Field Offset Type VT Attr Value Name
791018e0 4000096 4 System.Int32 1 instance 5 m_arrayLength
791018e0 4000097 8 System.Int32 1 instance 4 m_stringLength
790fe534 4000098 c System.Char 1 instance 61 m_firstChar
790fcb30 4000099 10 System.String 0 shared static Empty
>> Domain:Value 00149c58:790d81bc <<
7912b1d8 400009a 14 System.Char[] 0 shared static WhitespaceChars
>> Domain:Value 00149c58:012a16f0 <<
====================
windbg使用小总结
【抓mp】
1、一般抓法
adplus -hang -p 3230 -quiet 抓3230 pid进程,hang模式,相当于把那个进程暂停住,取内存快照
adplus -crash -pn w3wp -quiet 抓w3wp进程,crash模式,当那个进程崩溃结束的时候自动抓取当时的内存
adplus -hang -iis -quiet 抓IIS相关进程,包括其上host的web应用,以及iis自身
2、抓window服务
http://support.microsoft.com/kb/824344/zh-cn
3、远程抓
http://blog.joycode.com/tingwang/archive/2006/08/11/79763.aspx
4、抓蓝屏和死机的mp
电脑无故重启或者蓝屏会在C:/WINDOWS/Minimp/下保存一个minimp,但是这个minimp可用的命令很少,一般只打!analyze –v看到是哪个进程引起的,还有相关的驱动模块就基本定位问题了。
5、IIS回收的时候抓
http://blog.yesky.com/blog/omakey/archive/2006/12/17/1618015.html
6、计划任务抓
比如一个进程起来后不知道它什么时候会意外崩溃,可以在计划任务里用crash里抓,当那个进程意外终止的时候,cdb可以直接附加上去,抓取当时的mp,如果要抓一些会自动重启的进程,而且要抓每次重启前的mp,可以参考附录里一节。
【常用命令】
1、先path C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727,把.net路径设置为path环境变量,一遍在windbg里可以直接.load sos,而不必.load C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/sos.dll
2、ld demo,加载你程序的pdb文件,调试.net程序一般要把kernel32和mscorwks的符号加载上,关于这两个东西大家可以查资料,尤其是后者有哪些函数可以多了解一些。
3、在windbg的file/symbol file path对话框里输入以下文字,以便自动加载和下载符号
C:/WINDOWS/Symbols;d:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/symbols;.sympath SRV*d:/localsymbols*http://msdl.microsoft.com/download/symbols
其中有windows、.net2.0和自动从网上下载的调试符号,注意根据自己的情况适当修改目录
【调试死锁】
1、!syncblk,查看哪些线程拿到了锁
2、~67e!clrstack 跳到某个拿到锁的线程看它正在干什么操作,迟迟不肯释放锁
3、!runaway 查看这个占有锁的线程运行了多长时间。
4、~*e!clrstack查看所有线程的托管堆栈,看看哪些是正在等待锁的,比如hang在System.Threading.Monitor.Enter(System.Object)
5、~136s选择该线程,显示如下
0:000> ~136s eax=00005763 ebx=08deeb5c ecx=03eff0d4 edx=5570ab69 esi=08deeb5c edi=7ffd6000 eip=7c95ed54 esp=08deeb10 ebp=08deebb8 iopl=0 nv up ei pl zr na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246 ntdll!KiFastSystemCallRet: 7c95ed54 c3 ret
找到ecx寄存器的值,复制后ctrl+f,向上查找,会找到!syncblk的地方,如下
0:000> !syncblk Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner 1906 03ee4be4 5 1 03ee8f88 22c8 67 185e2ef0 System.Object 5390 052ca39c 3 1 05292b30 1dd4 49 1060d3ac System.Object 9372 0530702c 15 1 0012d3a8 1aa8 80 185e7704 System.Object 11428 03eff0d4 35 1 053b8fa8 169c 120 166acd98 System.Object 15278 0531c6b4 61 1 06bc1430 26d8 86 1a5bea88 System.Object
可以看到136线程等待的锁被120号线程占着不放(格式有点乱,凑合看),
6、有时候通过ecx寄存器找锁不是很确定,可以用~* kb来把所有线程堆栈打出来,然后根据!syncblk出来的同步快的值去搜索大概有多少个线程在等那个锁。因为同样是等待锁,可等的状态不一样,有的在Q里,有的锁已经升级,有的去尝试去拿锁了,所以不一定当时ecx寄存器指向那块内存,具体如何找到某个正在等待锁的线程等待的锁的内存地址,以及它正等待的这个锁被哪个线程拿着,我还没琢磨出规律来,但一般情况下,如果有其它同步对象的话,更难查。.net里用我上面说的几步就能查出锁的问题了。
【内存泄漏】
1、!mpheap -stat看看哪些对象个数最多,占内存最大,
2、找到某个格式比较多的对象,可以看它的方法表,然后用!mpheap -mt 66398fa4去随机找几个对象的地址
3、用!do 1e5a22bc命令去查看几个对象的状态,属性的值等,看看正常不正常
4、用!gcroot -nostacks 1e5a22bc去查看几个对象的根正常不正常,如果有些对象的根不是自己预先设计的那样,很可能被自己没想到的对象强引用了,所以GC无法回收它,就泄漏了。
【CPU百分百】
主要用几个计数器和!runaway命令,具体见以下链接
http://www.cnblogs.com/onlytianc ... 7/06/03/769307.html
【线程池耗尽】
!threadpool 能看到完成端口,线程池工作线程和timer回调各占线程池的情况。
【其它】
1、!eestack -short -ee查看所有重要(获取锁的,托管的,停止并允许回收的)线程的mpstack,差不多相当于~*e!mpstack
2、.time 可以看到进程跑了多少时间
3、!dso 查看当前线程里有哪些对象,分析内存泄漏问题也许会用到
Ⅱ 怎样把文件导出来
微信中的文件是可以导出保存的。
打开电脑版的微信,找到要下载保存的文件。
在文件上点击鼠标右键,选择保存。
选择好保存位置,点击保存就行了。
Ⅲ 电脑中毒无法正常开机,怎么样才能把重要文件拷贝出来呢
1、用U盘做一个启动盘,进入PE系统把电脑内的文件拷贝出来。如果U盘足够大,就直接复制到U盘。否则就连接移动硬盘进行备份。
2、把硬盘拆出来挂到别的电脑组成双硬盘,这样也可以把文件考出来。
3、看界面,建议先为电脑除一下尘,用橡皮擦把各个板卡金手指擦干净,特别是内存条多插拔几次试试。
Ⅳ 如何把一个文件夹从另一个文件夹里拿出来
在资源管理器中,选择这个文件夹,右键拖到目标位置后,菜单选择“移动到”就可以了。当然也可用剪切粘贴的办法。
Ⅳ 如何使DVD的VOB文件抓取下来还能保留中文字幕
分类: 电脑/网络 >> 软件 >> 多媒体软件
问题描述:
如何能够将DVD的VOB文件转换成MPG一类的文件,余含而且还能保留原电影中的中文字幕呢?
因为如果用采集的方式很浪费时间,如果可以把VOB文件直接转换过来,还保留原字幕,就很节省时间了!
解析:
把VOB格式转换成其它格式的工具很多朋友都想直接把手中的DVD直接转压成rmvb,方法有很多,现在介绍一种比较简单的方法。
以下方法可以从DVD的VOB文件直接转RM,中间没有经过其它的文件格式,所以得到的RM流文件的质量比较高,而且比DVD->AVI->RM的方法节省不少时间,还可以加上字幕。
需要的软件:
Elecard MPEG2 Video Decoder(VOB解码) ftpbbs.bitnp/mpeg2filter.rar
Batch Real Procer(BRP) 或 ERP等(RMVB压缩工具) dl96590.pchome/multimedia/video/brp1531_chs.exe
Decrypter(VOB提取工具)ftpbbs.bitnp/setupdvddecrypter.exe
VobSub(字幕提取工具)ftpbbs.bitnp/vobsub 2.32 All.exe
Elecard MPEG2 Video Decoder + CyberLink Audio Filter是图像和声音的Filter包,里面包含Elecard MPEG2 Video Decoder ver 和+ CyberLink Audio Filter都支持DirectShowR规范,CyberLink Audio Filter重现DVD音频是无以伦比的,如果此前安装有MPEG2的Filter应该先卸掉,安装此包后,可以用Windows Media Player打开一个DVD光盘上VOB文件试试,如果能正常播放,此时点击“文件-属性-高级”能看到AC3Filter、Elecard MPEG2 Video Decoder、MPEG-2 Splitter说明安装成功。Decrypter用于复制 DVD的VOB文件到硬盘,VobSub用于加字幕。
第一步:把DVD里的VOB文件复制(Rip)到硬盘上
你可以用Batch Real Procer直接压缩DVD光盘上的VOB文件了成RM了(可能对锁区域码的DVD无效),但如果字幕是分离的将不会有字幕,而且DVD光盘上的VOB文件是分开的,这对压缩整个影片或某首歌是不便的,再的是长时间读取对光驱的寿命不利。所以用Decrypter把DVD Rip到硬盘可以解决上述问题,一部大小为4G的影片Rip到硬盘用不到10分钟(16X-DVD)。
运行后,软件会自动读出dvd盘片上的vob文件。一般有几个文件是1G多的,这是主视频文件,用ctrl键选中他们。其他的几个几十兆的vob文件可能是菜单或版权警告之类,不用理会。
然后在选中的几个文件上面点鼠标右键选择“Stream Proessing...”,稍等一会会出现一个列团迹表选择需要的视频、音频和字幕流。其他默认,ok即可。
在tools--->settings下找到File Mode,选择File Splitting为none,否则转到影盘上仍然是孤立的几个vob文件,而不会合并成一个完整的。
最后点击开始就可以了。
第二步:提取字幕
调出vobsub configure。打开DVD光盘上与vob同名的那个ifo文件。因为我们是整段拷贝,所以这一步可以不用选择章节。直接建立字慕索引形成大家熟悉的sub字慕就可以了,需要5~10min(这个过程是把DVD文件解到硬盘中,速度的快慢由光驱的速度,硬盘和速度和碟子的好坏有关系)。
把不要的字幕放到Programchain no.1这个下面的框里面,点OK开始转换
修改字幕名称与视频文件名相同,仅扩展名不同,并保证字幕和视频在同一个文件夹下。用媒体播放器打开VOB文件看看字幕的效果是不是你想要的,如果字幕时间和塌毁并影片有延迟或提前,可以使用vobsub调整。
第三步:压制rmvb
用BRP(Batch Real Procer)或ERP等工具压制rmvb。由于安装了Elecard MPEG2 Video Decoder,所以这里可以直接对vob文件进行解码压制。运行BRP或ERP软件,添加视频源额时候选择刚刚rip出来的vob文件,然后设置码率(推荐平均码率500左右),设置音视频编码方式(real9或real10),设置EHQ(middle或high),不推荐使用二次编码(压缩时间要翻番,但效果几乎差不多),最后点击开始压缩就可以。由于解码方式不同直接从vob压制成rmvb时间可能会比从avi到rmvb要长,所以大家泡杯咖啡慢慢等待吧。
几点经验:
如果原先安装了WINDVD,先要把它卸载掉,在卸载时会提示它的共享文件要不要删除,选"YES"
在不剪切画面的情况下4:3的影片片用320×240或426×320的分辨率,16:9的影片用640×360或568×320的分辨率,不要使用原始尺寸压缩,那样效果反而差而且长宽比例有可能出问题。
Ⅵ 怎样抓出电脑中隐藏的文件
点 工具-文件选项-查看-选中显示所有文件及文件夹就OK拉
Ⅶ win7里面如何把文件件里面的文件批量取出来
呃,不知道有没有别的方法,给你提供个思路,你这一百多个文件夹里的文件类型旦衫如果是一样的,那你可以在存这100个文件夹的文件夹里用系统自带的搜索,比如搜.doc,然后就会显示所有.doc的文件,你可以全芹迟掘选然后剪切复制粘贴,如果文件类型不一样那就麻烦复制粘贴吧,可嫌核以下个Explorer+,快那么一点点