各种dump方法

本文详细介绍了用户进程和系统级别的Dump方法,包括使用任务管理器、WinDbg等工具进行Dump的操作步骤,以及如何通过设置注册表项来快速获取系统Dump文件。此外还介绍了不同类型的Dump文件及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dump的方法很多,各有特点,都应该掌握。

dump分为两种:用户进程dump、系统dump。先说用户进程的dump。
  • 最简单的是在Win7的任务管理器中右键点击进程,选择Create Dump File。完成之后会弹出对话框说明dump文件的位置。这对于死锁进程的调试有帮助。
  • 用WinDbg也很方便。WinDbg是绿色版,直接拷贝整个目录即可使用。可以Attach到任意的进程中,然后用命令.dump xxx.dmp即可。
  • WinDbg提供了一个方便的脚本,可以直接取运行中进程的dump,完成后自动detach,尽量减少对运行中进程的影响,方便分析CPU占用过高、死锁等问题:
adplus.vbs -hang -p 1234 -o d:\dump
另外几个用法:
adplus -crash -pn w3wp -quiet 抓w3wp进程,crash模式,当那个进程崩溃结束的时候自动抓取当时的内存

adplus -hang -iis -quiet 抓IIS相关进程,包括其上host的web应用,以及iis自身

  • WinDbg本身也是查看分析dump文件的最常见工具,直接打开dump文件即可。分析dump的常用命令:
!analyze -v 显示所有分析所需的常用信息。
k/kb 显示调用堆栈。
.ecxr 显示当前执行状态。

.lastevent 查看上一个事件(异常也是事件的一种)

  • 执行WinDbg.exe -I会把WinDbg安装成默认的异常处理程序。如果某个程序崩溃,则自动调用WinDbg进入调试状态。这时候可以方便的取dump。
  • 如果安装了VS2005、VS2008,也可以作为默认的debugger,在Option里面可以设置。进程崩溃启动VS后,可以从菜单中选取dump功能。

以上都是用户进程的dump方法,下面介绍系统dump(摘抄):
  • Dump文件有三种:完整内存转储,内核内存转储,小内存转储。System Properties中的高级选项中可以看到这些设置。
完整内存转储太大,一般是物理内存大小或多一些,包括了用户进程页面,这种方式不实用,2GB的物理内存转储出来至少要2GB的磁盘空间(还有文件头信息)。内核转储一般是200MB大小(物理内存小于4GB),它只是包含了所有属于内核模式的物理内存。小内存转储一般是64KB(64位上是 128KB),这两种方式是更常用的。
小内存转储在\Windows\Minidump下生成了一个叫Mini日期+序列号.dmp的文件,这个珍贵的资源就是系统Crash时刻的状态,只不过小内存转储只记录的有限的信息,而且在你分析时,如果windbg没有设置符号服务器的路径(关于符号服务器,请参考Windbg内核调试之二: 常用命令),那么你的当前系统必须和发生蓝屏的系统的Ntoskrnl.exe版本相同,否则就有找不到符号的问题产生。

  • 如果系统死锁了,而不是BSOD,可以设置快捷键抓取系统dump,按住Ctrl+ScrollLock+ScrollLock。导入如下注册表即可:
Windows Registry Editor Version 5.00
;For PS/2 keyboards:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters]
"CrashOnCtrlScroll"=dword:00000001
;For USB keyboards:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters]
"CrashOnCtrlScroll"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl]
"AutoReboot"=dword:00000000
"CrashDumpEnabled"=dword:00000001
"Overwrite"=dword:00000001

"LogEvent"=dword:00000001

 

如果发生了键盘没有ScrollLock的杯具,可以改变快捷键:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\crashdump]
Dump1Keys=0x22
Dump2Key=0x7e
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid\crashdump]
;Rightmost CTRL key + Leftmost CTRL key
Dump1Keys=0x22
;use pause/break key
Dump2Key=0x7e
设置:
参考文档:
http://msdn.microsoft.com/en-us/library/cc266483.aspx
http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc

转载于:https://www.cnblogs.com/tinyfish/archive/2009/12/03/1616612.html

<think>我们正在讨论的是Android中的dump方法实现。根据引用[1]和引用[2],用户可能是在寻找在Android中生成堆dump文件的方法,但根据用户的问题,他可能是想了解如何在自己的Android应用中实现一个dump方法,用于输出对象状态(类似于PHP的var_dump,引用[3])。 在Android中,实现dump方法通常有两种情况: 1. 为自定义类实现一个dump方法,用于输出对象的状态(类似于toString但更详细)。 2. 在系统调试中,实现一个dump方法以便通过dumpsys命令输出服务状态(系统服务开发)。 由于用户没有明确说明,我将分别给出两种场景的示例。 场景一:为自定义类实现dump方法(用于调试输出对象状态) 我们可以参考PHP的var_dump思想,在Java中为类添加一个dump方法,输出对象的字段信息。 场景二:实现一个系统服务,并使其支持dumpsys命令(需要继承系统服务并重写dump方法) 根据引用[2]中提到的“Heap dump android”,用户可能对内存分析感兴趣,但问题直接要求实现dump方法,因此我们主要关注如何实现dump方法。 下面分别给出两个示例: 示例1:自定义类的dump方法(简单版)</think>### Android 中实现 `dump()` 方法示例 在 Android 开发中,`dump()` 方法主要用于调试场景,可输出对象状态、内存信息或服务内部数据。以下是两种典型实现方式: --- #### 1. **自定义类的 `dump()` 方法(输出对象状态) 适用于调试自定义对象,类似 PHP 的 `var_dump()`(引用[3])[^3]。 ```java public class UserProfile { private String name; private int age; private List<String> permissions; // 实现 dump() 输出对象详情 public void dump(PrintWriter pw) { pw.println("===== UserProfile Dump ====="); pw.println("Name: " + name); pw.println("Age: " + age); pw.println("Permissions: " + String.join(", ", permissions)); pw.flush(); } // 测试调用 public static void main() { UserProfile user = new UserProfile("Alice", 28, Arrays.asList("read", "write")); user.dump(new PrintWriter(System.out)); // 输出到控制台 } } ``` **输出示例**: ``` ===== UserProfile Dump ===== Name: Alice Age: 28 Permissions: read, write ``` --- #### 2. **系统服务的 `dump()` 方法(支持 `dumpsys` 命令) 用于系统服务(如继承 `Binder` 的服务),可通过 `adb shell dumpsys` 查看状态(引用[1][^1], 引用[2][^2])。 ```java public class MyCustomService extends Binder { private int requestCount; private String lastError; @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("====== MyCustomService Status ======"); pw.println("Total requests: " + requestCount); pw.println("Last error: " + (lastError != null ? lastError : "None")); // 支持参数过滤(如 dumpsys my_service --error) if (args.length > 0 && args[0].equals("--error")) { pw.println("\n[Debug] Error details: ..."); } pw.flush(); } } ``` **使用步骤**: 1. **注册服务**(在 `SystemServer` 或 `Activity` 中): ```java // 在系统服务中注册 ServiceManager.addService("my_service", new MyCustomService()); ``` 2. **通过 adb 获取数据**: ```bash adb shell dumpsys my_service # 输出完整状态 adb shell dumpsys my_service --error # 按参数过滤 ``` --- #### 关键注意事项 1. **权限控制**: - 系统级 `dump()` 需声明权限: ```xml <uses-permission android:name="android.permission.DUMP" /> ``` 2. **性能优化**: - 避免在 `dump()` 中执行耗时操作(如数据库查询)。 - 复杂逻辑异步处理,输出缓存结果。 3. **内存分析**: - 结合 `adb` 生成堆转储文件分析内存泄漏(引用[1][^1]): ```bash adb shell am dumpheap <PID> /data/local/tmp/heapdump.hprof ``` 4. **安全风险**: - 敏感数据(如密码)不应出现在 `dump()` 输出中。 --- ### 完整调试流程示例 ```java // 1. 自定义服务实现 dump() public class DebugService extends Binder { private HashMap<String, String> configs = new HashMap<>(); @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("=== Configurations ==="); configs.forEach((key, value) -> pw.println(key + ": " + value)); } } // 2. 在 Activity 中触发 button.setOnClickListener(v -> { DebugService service = new DebugService(); service.dump(null, new PrintWriter(System.out), null); // 输出到 Logcat }); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值