!heap

简介

!heap扩展显示堆使用信息、控制堆管理器中的断点、检测泄漏的堆块、搜索堆块或显示页堆信息。此扩展支持段堆和NT堆。使用!heap没有参数列出所有堆及其类型的堆。

使用形式

!heap [HeapOptions] [ValidationOptions] [Heap]
!heap -b [{alloc|realloc|free} [Tag]] [Heap | BreakAddress]
!heap -B {alloc|realloc|free} [Heap | BreakAddress]
!heap -l
!heap -s [SummaryOptions] [StatHeapAddress]
!heap -i HeapAddress
!heap -x [-v] Address
!heap -p [PageHeapOptions]
!heap -srch [Size] Pattern
!heap -flt FilterOptions
!heap -stat [-h Handle [-grp GroupBy [MaxDisplay]]]
!heap [-p] -?
!heap -triage [Handle | Address]

参数

这些参数适用于Segment和NT堆。

  • -s
    指定正在请求摘要信息。如果省略SummaryOptions和StatHeapAddress,则显示与当前进程关联的所有堆的摘要信息。
  • SummaryOptions
    可以是以下选项的任意组合。SummaryOptions不区分大小写。输入!heap -s -?了解更多信息。
    选项 效果

    -v

    验证所有数据块。

    -b BucketSize

    指定存储桶大小。 默认值为1024位。

    -d DumpBlockSize

    指定存储桶大小。

    -a

    转储所有堆块。

    -c

    指定应显示每个块的内容。

  • -triage [Handle | Address]
    使调试器自动搜索进程堆中的失败。如果将堆句柄指定为参数,则检查该堆;否则,将搜索所有堆中包含给定地址的堆,如果找到,则检查该堆。使用-triage是验证低碎片堆(LFH)损坏的唯一方法。
  • -x[-v]
    使调试器搜索包含指定地址的堆块。如果添加了-v,该命令将搜索当前进程的整个虚拟内存空间以查找指向此堆块的指针。
  • -l
    使调试器检测泄漏的堆块。
  • -iAddress -h HeapAddress
    显示有关指定 的信息。
  • Address
    指定要搜索的地址。
  • -?
    在调试器命令窗口中显示此扩展的简短帮助文本。使用!heap -?一般的帮助,而且!heap -p -?页面堆帮助。

这些参数仅适用于NT堆。

  • HeapOptions
    可以是以下选项的任意组合。HeapOptions值区分大小写。

    选项 效果

    -v

    使调试器验证指定的堆。此选项不会检测到低碎片堆(LFH)损坏。使用-triage代替。

     

    -a

    使显示包含指定堆的所有信息。 大小,在本例中,将向上舍入到堆粒度。 (运行!heap 具有-a选项的堆等效于使用三个选项-h-f-m运行它,这可能需要很长时间。)

    -h

    使显示包含指定堆的所有非 LFH 条目。

    -hl

    使显示包含指定堆的所有条目,包括 LFH 条目。

    -f

    使显示包含指定堆的所有可用列表项。

    -m

    使显示内容包括指定堆的所有段条目。

    -t

    使显示包含指定堆的标记信息。

    -T

    使显示包含指定堆的伪标记条目。

    -g

    使显示内容包含全局标记信息。 全局标记与每个未标记的分配相关联。

    -s

    使显示内容包括指定堆的摘要信息。

    -k

    (仅限基于 x86 的目标)使显示内容包括与每个条目关联的 stack backtrace。

  • ValidationOptions
    可以是以下任一选项。ValidationOptions区分大小写。
    选项 效果

    -D

    对指定的堆禁用调用验证。

    -E

    为指定的堆启用调用时验证。

    -d

    为指定的堆禁用堆检查。

    -e

    为指定的堆启用堆检查。

  • -iHeapAddress or HeapAddress
    显示有关指定 的信息。
  • BreakAddress
    指定要在其中设置或删除断点的块的地址。
  • -b
    使调试器在堆管理器中创建条件断点。-b选项可以后跟alloc、realloc或free;这指定是否通过分配、重新分配或释放内存来激活断点。如果使用BreakAddress指定块的地址,则可以省略断点类型。如果使用Heap指定堆地址或堆索引,则必须包括类型以及标记参数。
  • Tag
    指定堆中的标记名称。
  • -B
    使调试器从堆管理器中删除条件断点。必须指定断点类型(alloc、realloc或free),并且必须与-b选项使用的断点类型相同。
  • StatHeapAddress
    指定堆的地址。 如果此为0或省略,则显示与当前进程关联的所有堆。
  • -p
    指定正在请求页堆信息。 如果在没有任何PageHeapOptions的情况下使用,则将显示所有页堆。
  • PageHeapOptions
    可以是以下选项中的任何一个。 PageHeapOptions区分大小写。 如果未指定任何选项,则将显示所有可能的页堆句柄。
    选项 效果

    -h Handle

    使调试器显示有关带有句柄句柄的页堆的详细信息。

    -a Address

    使调试器查找其块包含地址的页堆。 将包括此地址如何包含到整页堆块的完整详细信息,如此地址是否是页面堆的一部分、其在块内的偏移量,以及是分配块还是释放块。 每次提供堆栈跟踪。 使用此选项时,大小以堆分配粒度的倍数显示。

    -t[c|s][Traces]

    使调试器显示大量堆用户的已收集跟踪。 跟踪指定要显示的跟踪数;默认值为四。 如果跟踪超过指定的数量,则显示最早的跟踪。 如果使用-t-tc ,则跟踪按计数使用情况进行排序。 如果使用-ts ,则跟踪按大小排序。 (仅 Windows XP 支持-tc-ts选项; 仅在 windows xp 和更早版本的 windows 中支持-t选项。)

    -fi[Traces]

    使调试器显示最新的错误注入跟踪。 跟踪指定要显示的数量;默认值为4。

    -all

    使调试器显示有关所有页堆的详细信息。

    -?

    使调试器显示页堆帮助,包括堆块的关系图。 (也可以在下面的 "备注" 部分中查看这些关系图。)

  • -srch
    扫描给定模式的所有堆。
  • Pattern 
    指定要查找的模式。
  • Size
    可以是以下选项中的任何一个。 这将指定模式的大小。 "-" 是必需的。
    选项 效果

    -b

    模式大小为1个字节。

    -w

    模式为一个大小的单词。

    -d

    模式为一个 DWORD 大小。

    -q

    模式为大小为1个 QWORD。

    如果未指定上述任何一个,则假设模式的大小与计算机指针的大小相同。

  • -flt
    将显示范围限制为仅包含具有指定大小或大小范围的堆。
  • FilterOptions
    可以是以下选项中的任何一个。 FilterOptions区分大小写。
    选项 效果

    s 大小

    将显示范围限制为仅包含指定大小的堆。

    r SizeMin SizeMax

    将显示范围限制为仅包含指定大小范围内的堆。

  • -stat
    显示指定堆的使用情况统计信息。
  • -h Handle
    导致显示仅显示在句柄上的堆的使用情况统计信息。 如果Handle为0或省略,则显示所有堆的使用情况统计信息。
  • -grp GroupBy
    GroupBy指定的重新排序显示。 可以在下表中找到GroupBy的选项。

    选项 效果

    A

    根据分配大小显示使用情况统计信息。

    B

    根据块计数显示使用情况统计信息。

    S

    根据每个分配的总大小显示使用量统计信息。

  • MaxDisplay
    将输出限制为仅MaxDisplay的行数。

支持环境

Windows XP 和更高版本 Ext .dll Exts

备注

此扩展命令可用于执行各种任务。

标准 !heap命令用于显示当前进程的堆信息。 (这应该只用于用户模式进程。 !heap Pool extension 命令应用于系统进程。)

!heap-b!heap -B命令用于在堆管理器中创建和删除条件断点。

!heap -l命令检测泄漏的堆块。 它使用垃圾回收器算法来检测未在进程地址空间中的任何位置引用的堆中的所有繁忙块。 对于大型应用程序,可能需要几分钟才能完成。 此命令仅在 Windows XP 和更高版本的 Windows 中可用。

!heap -x命令搜索包含给定地址的堆块。 如果使用了 -v选项,则此命令将另外在当前进程的整个虚拟内存空间中搜索指向此堆块的指针。 此命令仅在 Windows XP 和更高版本的 Windows 中可用。

!heap -p命令显示了各种形式的页堆信息。 使用 !heap -p之前,必须为目标进程启用页堆。 这是通过全局标志(gflags)实用程序来完成的。 为此,请启动实用工具,在 "映像文件" 文本框中填写目标应用程序的名称,选择 "映像文件选项" 并启用页堆,并单击 "应用"。 或者,你可以通过键入gflags/i xxx + hpa(其中, xxx是目标应用程序的名称)从命令提示符窗口启动全局标志实用程序。

不支持在 Windows XP 以外的情况!heap -p -t[c|s]命令。 使用随调试器包一起提供的UMDH工具来获取类似的结果。

!heap -srch命令显示包含某个指定模式的堆条目。

!heap -flt命令会将显示范围限制为仅指定大小的堆分配。

!heap -stat命令显示堆使用情况统计信息。

下面是标准!heap 命令的示例:

0:000> !ntsdexts.heap -a
Index Address Name Debugging options enabled
1: 00250000
Segment at 00250000 to 00350000 (00056000 bytes committed)
Flags: 50000062
ForceFlags: 40000060
Granularity: 8 bytes
Segment Reserve: 00100000
Segment Commit: 00004000
DeCommit Block Thres:00000400
DeCommit Total Thres:00002000
Total Free Size: 000003be
Max. Allocation Size:7ffddfff
Lock Variable at: 00250b54
Next TagIndex: 0012
Maximum TagIndex: 07ff
Tag Entries: 00350000
PsuedoTag Entries: 00250548
Virtual Alloc List: 00250050
UCR FreeList: 002504d8
128-bit bitmap of free lists
FreeList Usage: 00000014 00000000 00000000 00000000
Free Free
List List
# Head Blink Flink
FreeList[ 00 ] at 002500b8: 002a4378 . 002a4378
0x02 - HEAP_ENTRY_EXTRA_PRESENT
0x04 - HEAP_ENTRY_FILL_PATTERN
Entry Prev Cur 0x10 - HEAP_ENTRY_LAST_ENTRY Address Size Size flags
002a4370: 00098 . 01c90 [14] - free
FreeList[ 02 ] at 002500c8: 0025cb30 . 002527b8
002527b0: 00058 . 00010 [04] - free
0025cb28: 00088 . 00010 [04] - free
FreeList[ 04 ] at 002500d8: 00269a08 . 0026e530
0026e528: 00038 . 00020 [04] - free
0026a4d0: 00038 . 00020 [06] - free
0026f9b8: 00038 . 00020 [04] - free
0025cda0: 00030 . 00020 [06] - free
00272660: 00038 . 00020 [04] - free
0026ab60: 00038 . 00020 [06] - free
00269f20: 00038 . 00020 [06] - free
00299818: 00038 . 00020 [04] - free
0026c028: 00038 . 00020 [06] - free
00269a00: 00038 . 00020 [46] - free Segment00 at 00250b90:
Flags: 00000000
Base: 00250000
First Entry: 00250bc8
Last Entry: 00350000
Total Pages: 00000080
Total UnCommit: 00000055
Largest UnCommit:000aa000
UnCommitted Ranges: (1)
002a6000: 000aa000 Heap entries for Segment00 in Heap 250000
0x01 - HEAP_ENTRY_BUSY
0x02 - HEAP_ENTRY_EXTRA_PRESENT
0x04 - HEAP_ENTRY_FILL_PATTERN
0x08 - HEAP_ENTRY_VIRTUAL_ALLOC
0x10 - HEAP_ENTRY_LAST_ENTRY
0x20 - HEAP_ENTRY_SETTABLE_FLAG1
0x40 - HEAP_ENTRY_SETTABLE_FLAG2
Entry Prev Cur 0x80 - HEAP_ENTRY_SETTABLE_FLAG3 Address Size Size flags (Bytes used) (Tag name)
00250000: 00000 . 00b90 [01] - busy (b90)
00250b90: 00b90 . 00038 [01] - busy (38)
00250bc8: 00038 . 00040 [07] - busy (24), tail fill (NTDLL!LDR Database)
00250c08: 00040 . 00060 [07] - busy (48), tail fill (NTDLL!LDR Database)
00250c68: 00060 . 00028 [07] - busy (10), tail fill (NTDLL!LDR Database)
00250c90: 00028 . 00060 [07] - busy (48), tail fill (NTDLL!LDR Database)
00250cf0: 00060 . 00050 [07] - busy (38), tail fill (Objects= 80)
00250d40: 00050 . 00048 [07] - busy (2e), tail fill (NTDLL!LDR Database)
00250d88: 00048 . 00c10 [07] - busy (bf4), tail fill (Objects>1024)
00251998: 00c10 . 00030 [07] - busy (12), tail fill (NTDLL!LDR Database)
...
002525c0: 00030 . 00060 [07] - busy (48), tail fill (NTDLL!LDR Database)
00252620: 00060 . 00050 [07] - busy (38), tail fill (NTDLL!LDR Database)
00252670: 00050 . 00040 [07] - busy (22), tail fill (NTDLL!CSRSS Client)
002526b0: 00040 . 00040 [07] - busy (24), tail fill (Objects= 64)
002526f0: 00040 . 00040 [07] - busy (24), tail fill (Objects= 64)
00252730: 00040 . 00028 [07] - busy (10), tail fill (Objects= 40)
00252758: 00028 . 00058 [07] - busy (3c), tail fill (Objects= 88)
002527b0: 00058 . 00010 [04] free fill
002527c0: 00010 . 00058 [07] - busy (3c), tail fill (NTDLL!LDR Database)
00252818: 00058 . 002d0 [07] - busy (2b8), tail fill (Objects= 720)
00252ae8: 002d0 . 00330 [07] - busy (314), tail fill (Objects= 816)
00252e18: 00330 . 00330 [07] - busy (314), tail fill (Objects= 816)
00253148: 00330 . 002a8 [07] - busy (28c), tail fill (NTDLL!LocalAtom)
002533f0: 002a8 . 00030 [07] - busy (18), tail fill (NTDLL!LocalAtom)
00253420: 00030 . 00030 [07] - busy (18), tail fill (NTDLL!LocalAtom)
00253450: 00030 . 00098 [07] - busy (7c), tail fill (BASEDLL!LMEM)
002534e8: 00098 . 00060 [07] - busy (44), tail fill (BASEDLL!TMP)
00253548: 00060 . 00020 [07] - busy (1), tail fill (Objects= 32)
00253568: 00020 . 00028 [07] - busy (10), tail fill (Objects= 40)
00253590: 00028 . 00030 [07] - busy (16), tail fill (Objects= 48)
...
0025ccb8: 00038 . 00060 [07] - busy (48), tail fill (NTDLL!LDR Database)
0025cd18: 00060 . 00058 [07] - busy (3c), tail fill (NTDLL!LDR Database)
0025cd70: 00058 . 00030 [07] - busy (18), tail fill (NTDLL!LDR Database)
0025cda0: 00030 . 00020 [06] free fill (NTDLL!Temporary)
0025cdc0: 00020 . 00258 [07] - busy (23c), tail fill (Objects= 600)
0025d018: 00258 . 01018 [07] - busy (1000), tail fill (Objects>1024)
0025e030: 01018 . 00060 [07] - busy (48), tail fill (NTDLL!LDR Database)
...
002a4190: 00028 . 00118 [07] - busy (100), tail fill (BASEDLL!GMEM)
002a42a8: 00118 . 00030 [07] - busy (18), tail fill (Objects= 48)
002a42d8: 00030 . 00098 [07] - busy (7c), tail fill (Objects= 152)
002a4370: 00098 . 01c90 [14] free fill
002a6000: 000aa000 - uncommitted bytes.

下面是!heap -l命令的示例:

1:0:011> !heap -l
1:Heap 00170000
Heap 00280000
Heap 00520000
Heap 00b50000
Heap 00c60000
Heap 01420000
Heap 01550000
Heap 016d0000
Heap 019b0000
Heap 01b40000
Scanning VM ...
## Entry User Heap Segment Size PrevSize Flags 001b2958 001b2960 00170000 00000000 40 18 busy extra
001b9cb0 001b9cb8 00170000 00000000 80 300 busy extra
001ba208 001ba210 00170000 00000000 80 78 busy extra
001cbc90 001cbc98 00170000 00000000 e0 48 busy extra
001cbd70 001cbd78 00170000 00000000 d8 e0 busy extra
001cbe90 001cbe98 00170000 00000000 68 48 busy extra
001cbef8 001cbf00 00170000 00000000 58 68 busy extra
001cc078 001cc080 00170000 00000000 f8 128 busy extra
001cc360 001cc368 00170000 00000000 80 50 busy extra
001cc3e0 001cc3e8 00170000 00000000 58 80 busy extra
001fe550 001fe558 00170000 00000000 150 278 busy extra
001fe6e8 001fe6f0 00170000 00000000 48 48 busy extra
002057a8 002057b0 00170000 00000000 58 58 busy extra
00205800 00205808 00170000 00000000 48 58 busy extra
002058b8 002058c0 00170000 00000000 58 70 busy extra
00205910 00205918 00170000 00000000 48 58 busy extra
00205958 00205960 00170000 00000000 90 48 busy extra
00246970 00246978 00170000 00000000 60 88 busy extra
00251168 00251170 00170000 00000000 78 d0 busy extra user_flag
00527730 00527738 00520000 00000000 40 40 busy extra
00527920 00527928 00520000 00000000 40 80 busy extra
21 leaks detected.

此示例中的表包含发现的所有21个泄漏。

下面是!heap x命令的示例:

0:011> !heap 002057b8 -x
## Entry User Heap Segment Size PrevSize Flags 002057a8 002057b0 00170000 00170640 58 58 busy extra

下面是!heap -x v命令的示例:

1:0:011> !heap 002057b8 -x -v
## 1:Entry User Heap Segment Size PrevSize Flags 002057a8 002057b0 00170000 00170640 58 58 busy extra Search VM for address range 002057a8 - 002057ff : 00205990 (002057d0),

在此示例中,有一个指向地址0x00205990 的堆块的指针。

下面是 !heap flt s命令的示例:

0:001>!heap -flt s 0x50

这会显示大小0x50 的所有分配。

下面是 !heap flt r命令的示例:

0:001>!heap -flt r 0x50 0x80

这会显示大小介于0x50 和0x7F 之间的每个分配。

下面是 !heap srch命令的示例。

0:001> !heap -srch 77176934
_HEAP @ 00090000
in HEAP_ENTRY: Size : Prev Flags - UserPtr UserSize - state
00099A48: 0018 : 0005 [01] - 00099A50 (000000B8) - (busy)
ole32!CALLFRAME_CACHE<INTERFACE_HELPER_CLSID>::`vftable'
_HEAP @ 00090000
in HEAP_ENTRY: Size : Prev Flags - UserPtr UserSize - state
00099B58: 0018 : 0005 [01] - 00099B60 (000000B8) - (busy)
ole32!CALLFRAME_CACHE<INTERFACE_HELPER_CLSID>::`vftable'

轻型页堆块--已分配:

 +-----+---------------+---+
| | | |
+-----+---------------+---+
^ ^ ^
| | 8 suffix bytes (filled with 0xA0)
| User allocation (filled with E0 if zeroing not requested)
Block header (starts with 0xABCDAAAA and ends with 0xDCBAAAAA)

轻型页堆块--已释放:

 +-----+---------------+---+
| | | |
+-----+---------------+---+
^ ^ ^
| | 8 suffix bytes (filled with 0xA0)
| User allocation (filled with F0 bytes)
Block header (starts with 0xABCDAAA9 and ends with 0xDCBAAA9)

整页堆块--已分配:

 +-----+---------+---+-------
| | | | ... N/A page
+-----+---------+---+-------
^ ^ ^
| | 0-7 suffix bytes (filled with 0xD0)
| User allocation (if zeroing not requested, filled
with C0)
Block header (starts with 0xABCDBBBB and ends with 0xDCBABBBB)

整页堆块--已释放:

 +-----+---------+---+-------
| | | | ... N/A page
+-----+---------+---+-------
^ ^ ^
| | 0-7 suffix bytes (filled with 0xD0)
| User allocation (filled with F0 bytes)
Block header (starts with 0xABCDBBA and ends with 0xDCBABBBA)
要查看堆块或整页堆块的分配或释放的堆栈跟踪,请使用dt DPH_block_INFORMATION和头地址,然后使用dds和块的stack trace字段。

WinDbg常用命令系列---!heap的更多相关文章

  1. WinDbg常用命令系列---.cmdtree

    .cmdtree 简介 使用形式 .cmdtree cmdfile 参数 cmdfile命令文件,包含多个你需要的命令.必须是一个文本档 使用步骤 1.使用命令创建文本文件test.wl,使用以下示例 ...

  2. WinDbg常用命令系列---显示段选择器dg、链接列表dl和字符串ds/dS

    dg (Display Selector) dg命令显示指定选择器的段描述符. dg FirstSelector [LastSelector] 参数: FirstSelector指定要显示的第一个选择 ...

  3. WinDbg常用命令系列---!uniqstack

    简介 这个!uniqstack扩展扩展显示的所有线程的堆栈的所有当前进程,不包括显示为具有重复项的堆栈中. 使用形式 !uniqstack [ -b | -v | -p ] [ -n ] 参数 -b将 ...

  4. WinDbg常用命令系列---.write_cmd_hist (写命令历史记录)

    .write_cmd_hist 简介 .write_cmd_hist命令将调试器命令窗口的整个历史记录写入文件. 使用形式 .write_cmd_hist Filename 参数 Filename指定 ...

  5. WinDbg常用命令系列---!address

    !address 这个!address扩展命令显示有关目标进程或目标计算机使用的内存的信息. 用户模式: !address Address !address -summary !address [-f ...

  6. WinDbg常用命令系列---源代码操作相关命令

    lsf, lsf- (Load or Unload Source File) lsf和lsf-命令加载或卸载源文件. lsf Filename lsf- Filename 参数: Filename指定 ...

  7. WinDbg常用命令系列---单步执行p*

    p (Step) p命令执行单个指令或源代码行,并可选地显示所有寄存器和标志的结果值.当子例程调用或中断发生时,它们被视为单个步骤. 用户模式: [~Thread] p[r] [= StartAddr ...

  8. WinDbg常用命令系列---断点操作b*

    ba (Break on Access) ba命令设置处理器断点(通常称为数据断点,不太准确).此断点在访问指定内存时触发. 用户模式下 [~Thread] ba[ID] Access Size [O ...

  9. WinDbg常用命令系列---查看线程调用栈命令K*简介

    Windbg里的K*命令显示给定线程的堆栈帧以及相关信息,对于我们调试时,进行调用栈回溯有很大的帮助. 一.K*命令使用方式 在不同平台上,K*命令的使用组合如下 User-Mode, x86 Pro ...

随机推荐

  1. Kafka学习笔记(三)——架构深入

    之前搭建好了Kafka的学习环境,了解了具体的配置文件内容,并且测试了生产者.消费者的控制台使用方式,也学习了基本的API.那么下一步,应该学习一下具体的内部流程~ 1.Kafka的工作流程 大致的工 ...

  2. 《JAVA高并发编程详解》-七种单例模式

  3. Spring Boot Freemarker特别篇之contextPath【从零开始学Spring Boot

      需求缘起:有人在群里@我:请教群主大神一个问题,spring boot  + freemarker 怎么获取contextPath 头疼死我了,网上没一个靠谱的 .我就看看之前博客中的 [Spri ...

  4. 关于SQL中SELECT *(星号)的危害论

    听闻有许多人是禁止开发人员在SQL中使用SELECT *的,这里翻译一下StackOverflow的一篇提问,个人认为相当客观 [SELECT *]危害主要有以下几点: 给数据消费者传数据的低效.当你 ...

  5. 4.将验证添加到 ASP.NET Core Razor 页面

    向 Movie 模型添加了验证逻辑. 每当用户创建或编辑电影时,都会强制执行验证规则. 1.打开Movie.cs文件.DataAnnotations命名空间提供了一组内置的验证属性,这些属性以声明方式 ...

  6. 图像平移 cv.warpAffine()函数用法

    # 图像平移image1='C:\\Users\\10107472\\Desktop\\myfile\\tensorflow-yolov\\read.jpg'img = cv.imread(image ...

  7. Git查看文件制定行区间的提交记录

    git blame -L , /dir/file/file.php 这里查看file文件下6610至6613行的修改记录

  8. kali之DVWA

    简介 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境, ...

  9. 【转载】C#中double.TryParse方法和double.Parse方法的异同之处

    在C#编程过程中,double.TryParse方法和double.Parse方法都可以将字符串string转换为double类型,但两者还是有区别,最重要的区别在于double.TryParse方法 ...

  10. Exception和RuntimeException区别

    Exception:强制性要求用户必须进行处理: RuntimeException:是Exception的子类,由用户选择是否进行处理: