当前位置: 首页 > news >正文

软件调试纵横谈-17-win32堆的调试支持

17.Win32堆的调试支持_哔哩哔哩_bilibili  
继续边看录像边做实验。

堆上的内存时用size表达的,组成一个链表。

创建一个FreCheck应用

上次看heap,直接使用下载的文件,本次要做实验了,就需要自己动手,搞个VC project了。

在vs2022中直接建立一个console应用。建立一个FreCheck.cpp

#include <stdio.h>
#include <windows.h>int main(int argc, char* argv[]) {char* p;HANDLE hHeap;hHeap = HeapCreate(0, 1024, 0);p = (char*)HeapAlloc(hHeap, 0, 9);for (int i = 0; i < 20; i++)*(p + i) = i;if (!HeapFree(hHeap, 0, p))printf("Free %x from %x failed.", p, hHeap);if (!HeapDestroy(hHeap))printf("Destroy heap %x failed.", hHeap);printf("Exit with 0");return 0;
}

下断点
0:000> x FreCheck!*main*
0015a018          FreCheck!__scrt_native_dllmain_reason = 0xffffffff
00151880          FreCheck!main (int, char **)
001521a0          FreCheck!__scrt_main_policy::set_app_type (void)
00152e40          FreCheck!__scrt_dllmain_uninitialize_c (void)
00152150          FreCheck!invoke_main (void)
0:000> bp FreCheck!main
breakpoint 0 redefined
0:000> bl
     0 e Disable Clear  00151880     0001 (0001)  0:**** FreCheck!main

运行
0:000> g
发现堆已经好几个了
0:000> !heap
Failed to read heap keySEGMENT HEAP ERROR: failed to initialize the extention
NtGlobalFlag enables following debugging aids for new heaps:    tail checking
    free checking
    validate parameters
Index   Address  Name      Debugging options enabled
  1:   01250000                 tail checking free checking validate parameters
  2:   01650000                 tail checking free checking validate parameters
  3:   02f40000                 tail checking free checking validate parameters
  4:   01600000                 tail checking free checking validate parameters
  5:   03220000                 tail checking free checking validate parameters
  6:   03330000                 tail checking free checking validate parameters
  7:   03210000                 tail checking free checking validate parameters
  8:   033b0000                 tail checking free checking validate parameters
  9:   035a0000                 tail checking free checking validate parameters

更新windbg

总是有一行错误,难道是我的windbg版本问题?
0:000> !heap
Failed to read heap keySEGMENT HEAP ERROR: failed to initialize the extention

刚学了一招更新windbg版本,试试
其实安装了vs2022,就会安装debug:C:\Program Files (x86)\Windows Kits\10\Debuggers
如何让他保持最新?进入控制面板

点击更改:

勾选红色:

这时当前版本,一会儿看看有啥变化

新版本:

运行看看:

果然不再出现错误了:

0:000> !heap
        Heap Address      NT/Segment Heap

              850000              NT Heap
0:000> bp FreCheck!main
0:000> g

0:000> !heap
        Heap Address      NT/Segment Heap

              850000              NT Heap
              e70000              NT Heap
             2770000              NT Heap
             28a0000              NT Heap
              de0000              NT Heap
             2a10000              NT Heap
             2b10000              NT Heap
             2a00000              NT Heap
             2ef0000              NT Heap
新版本清爽多了。

继续研究FreCheck

!heap发现,进入main断点后,已经从1个堆变成了9个堆。看看加载了啥模块

已经加载了很多模块。
0:000> k
 # ChildEBP RetAddr      
00 003ffd08 00b52183     FreCheck!main [C:\cpp\vc2022\FreCheck\FreCheck.cpp @ 4] 
01 003ffd28 00b51fca     FreCheck!invoke_main+0x33 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 78] 
02 003ffd84 00b51e5d     FreCheck!__scrt_common_main_seh+0x15a [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 288] 
03 003ffd8c 00b52208     FreCheck!__scrt_common_main+0xd [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 331] 
04 003ffd94 76907ba9     FreCheck!mainCRTStartup+0x8 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp @ 17] 
05 003ffda4 77d1c10b     KERNEL32!BaseThreadInitThunk+0x19
06 003ffdfc 77d1c08f     ntdll!__RtlUserThreadStart+0x2b
07 003ffe0c 00000000     ntdll!_RtlUserThreadStart+0x1b
查看crt堆
0:000> x FreCheck!_crt*
00b51cb0          FreCheck!_CRT_RTC_INIT (void *, void **, int, int, int)
00b51cc0          FreCheck!_CRT_RTC_INITW (void *, void **, int, int, int)
00b53980          FreCheck!_crt_debugger_hook (int)
00b553b4          FreCheck!_crt_atexit (__crt_atexit)
00b553ba          FreCheck!_crt_at_quick_exit (__crt_at_quick_exit)
00b55312          FreCheck!_CrtDbgReportW (__CrtDbgReportW)
00b5530c          FreCheck!_CrtDbgReport (__CrtDbgReport)
0:000> x FreCheck!*heap*
00b5b00c          FreCheck!_imp__HeapFree = <no type information>
00b5b004          FreCheck!_imp__HeapDestroy = <no type information>
00b5b000          FreCheck!_imp__HeapCreate = <no type information>
00b51a51          FreCheck!HeapCreate (_HeapCreate@12)
00b5b020          FreCheck!_imp__GetProcessHeap = <no type information>
00b51a5d          FreCheck!HeapAlloc (_HeapAlloc@12)
00b51a63          FreCheck!HeapFree (_HeapFree@12)
00b51a57          FreCheck!HeapDestroy (_HeapDestroy@4)
00b55438          FreCheck!GetProcessHeap (_GetProcessHeap@0)
00b5b008          FreCheck!_imp__HeapAlloc = <no type information>
并没有录像中的_crtHeap
单步到如下位置:
0:000> p
eax=00b5c0a2 ebx=004d1000 ecx=00b5c0a2 edx=00000001 esi=006ff704 edi=006ff7f4
eip=7690d296 esp=006ff6f4 ebp=006ff7f4 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
KERNEL32!HeapCreateStub+0x6:
7690d296 ff25e8129776    jmp     dword ptr [KERNEL32!_imp__HeapCreate (769712e8)] ds:002b:769712e8={KERNELBASE!HeapCreate (762c9870)}
0:000> pc
eax=00000000 ebx=004d1000 ecx=00001002 edx=00000000 esi=006ff704 edi=006ff7f4
eip=762c98ab esp=006ff6d0 ebp=006ff6f0 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
KERNELBASE!HeapCreate+0x3b:
762c98ab ff15988a3b76    call    dword ptr [KERNELBASE!_imp__RtlCreateHeap (763b8a98)] ds:002b:763b8a98={ntdll!RtlCreateHeap (77d092d0)}
0:000> wt
    4     0 [  0] ntdll!RtlCreateHeap
   22     0 [  1]   ntdll!_SEH_prolog4_GS
   52    22 [  0] ntdll!RtlCreateHeap
   40     0 [  1]   ntdll!memset
  149    62 [  0] ntdll!RtlCreateHeap
   27     0 [  1]   ntdll!RtlDebugCreateHeap
    3     0 [  2]     ntdll!RtlCreateHeap
   22     0 [  3]       ntdll!_SEH_prolog4_GS
   47    22 [  2]     ntdll!RtlCreateHeap
   40     0 [  3]       ntdll!memset
  162    62 [  2]     ntdll!RtlCreateHeap
   11     0 [  3]       ntdll!RtlpHeapGenerateRandomValue32
   14     0 [  4]         ntdll!RtlRandomEx
   13     0 [  5]           ntdll!RtlRunOnceExecuteOnce
   33     0 [  6]             ntdll!RtlRunOnceBeginInitialize
   25    33 [  5]           ntdll!RtlRunOnceExecuteOnce
   72    58 [  4]         ntdll!RtlRandomEx
   17   130 [  3]       ntdll!RtlpHeapGenerateRandomValue32
  164   209 [  2]     ntdll!RtlCreateHeap
   11     0 [  3]       ntdll!RtlpHeapGenerateRandomValue32
   14     0 [  4]         ntdll!RtlRandomEx
   13     0 [  5]           ntdll!RtlRunOnceExecuteOnce
   33     0 [  6]             ntdll!RtlRunOnceBeginInitialize
   25    33 [  5]           ntdll!RtlRunOnceExecuteOnce
   72    58 [  4]         ntdll!RtlRandomEx
   17   130 [  3]       ntdll!RtlpHeapGenerateRandomValue32
  189   356 [  2]     ntdll!RtlCreateHeap
    1     0 [  3]       ntdll!NtAllocateVirtualMemory
   22     0 [  3]       LHShield
    1     0 [  4]         KERNEL32!GetLastErrorStub
    3     0 [  4]         KERNELBASE!GetLastError
   33     4 [  3]       LHShield
   16     0 [  4]         LHShield
    7     0 [  5]           LHShield!QAXStart
   27     7 [  4]         LHShield
    7     0 [  5]           LHShield!QAXStart
   12     0 [  6]             LHShield!QAXStart
    1     0 [  7]               LHShield
   13     1 [  6]             LHShield!QAXStart
   14     0 [  7]               KERNELBASE!InitOnceExecuteOnce
   13     0 [  8]                 ntdll!RtlRunOnceExecuteOnce
   33     0 [  9]                   ntdll!RtlRunOnceBeginInitialize
   25    33 [  8]                 ntdll!RtlRunOnceExecuteOnce
   21    58 [  7]               KERNELBASE!InitOnceExecuteOnce
   17    80 [  6]             LHShield!QAXStart
   10    97 [  5]           LHShield!QAXStart
   33   114 [  4]         LHShield
    5     0 [  5]           LHShield!QAXStart
   13     0 [  6]             LHShield!QAXStart
    7    13 [  5]           LHShield!QAXStart
   41   134 [  4]         LHShield
   36   179 [  3]       LHShield
    1     0 [  4]         KERNEL32!GetCurrentProcess
    2     0 [  4]         KERNELBASE!GetCurrentProcess
   49   182 [  3]       LHShield
    1     0 [  4]         0x6e380510
    1     0 [  4]         0x6e380515
    2     0 [  4]         ntdll!NtAllocateVirtualMemory
    1     0 [  5]           ntdll!Wow64SystemServiceCall
    1     0 [  5]           0x00297000
HEAP[FreCheck.exe]: Heap block at 037705C0 modified at 037705D1 past requested size of 9
    1     0 [  5]           LHShield
    8     0 [  5]           ntdll!RtlpCheckBusyBlockTail
>> No match on ret
    8     0 [  5]           ntdll!RtlpCheckBusyBlockTail
   12     0 [  5]           ntdll!RtlpValidateHeapEntry
   13     0 [  6]             ntdll!DbgPrint
    3     0 [  7]               ntdll!vDbgPrintExWithPrefixInternal
   22     0 [  8]                 ntdll!_SEH_prolog4_GS
   33    22 [  7]               ntdll!vDbgPrintExWithPrefixInternal
    9     0 [  8]                 ntdll!_alloca_probe_16
   16     0 [  8]                 ntdll!_alloca_probe
   52    47 [  7]               ntdll!vDbgPrintExWithPrefixInternal
   25     0 [  8]                 ntdll!memcpy
   75    72 [  7]               ntdll!vDbgPrintExWithPrefixInternal
    9     0 [  8]                 ntdll!_vsnprintf
   28     0 [  9]                   ntdll!_vsnprintf_l
   65     0 [ 10]                     ntdll!_output_l
   22     0 [ 11]                       ntdll!write_char
  102    22 [ 10]                     ntdll!_output_l
   22     0 [ 11]                       ntdll!write_char
  139    44 [ 10]                     ntdll!_output_l
   22     0 [ 11]                       ntdll!write_char
  176    66 [ 10]                     ntdll!_output_l
   22     0 [ 11]                       ntdll!write_char
  213    88 [ 10]                     ntdll!_output_l
   22     0 [ 11]                       ntdll!write_char
  379   110 [ 10]                     ntdll!_output_l
   10     0 [ 11]                       ntdll!write_multi_char
  387   120 [ 10]                     ntdll!_output_l
   17     0 [ 11]                       ntdll!write_string
  407   137 [ 10]                     ntdll!_output_l
    9     0 [ 11]                       ntdll!wctomb_s
   25     0 [ 12]                         ntdll!_wctomb_s_l
   10     0 [ 13]                           ntdll!RtlUnicodeToMultiByteN
   10     0 [ 14]                             ntdll!RtlpGetCodePageData
   15     0 [ 15]                               ntdll!RtlpIsUtf8Process
   20    15 [ 14]                             ntdll!RtlpGetCodePageData
   12    35 [ 13]                           ntdll!RtlUnicodeToMultiByteN
   59     0 [ 14]                             ntdll!RtlUnicodeToCustomCPN
   15    94 [ 13]                           ntdll!RtlUnicodeToMultiByteN
   35   109 [ 12]                         ntdll!_wctomb_s_l
   12   144 [ 11]                       ntdll!wctomb_s
  419   293 [ 10]                     ntdll!_output_l
   22     0 [ 11]                       ntdll!write_string
   22     0 [ 12]                         ntdll!write_char
   35    22 [ 11]                       ntdll!write_string
  434   350 [ 10]                     ntdll!_output_l
    9     0 [ 11]                       ntdll!wctomb_s
。。。。。。
太长省略了,比录像中的长多了,看来版本变化还是很大的,windows越来越复杂。
运行完直接停止了。只能.restart
重新分析:

0:000> !heap
        Heap Address      NT/Segment Heap

              620000              NT Heap
              ad0000              NT Heap
             2480000              NT Heap
             2630000              NT Heap
             2720000              NT Heap
             29c0000              NT Heap
             2710000              NT Heap
             2aa0000              NT Heap
             2c90000              NT Heap
0:000> dv
              i = 0n-858993460
           argc = 0n1
           argv = 0x0322e4c8
          hHeap = 0x036c0000
              p = 0x036c05c8 ".???"

0:000> !heap
        Heap Address      NT/Segment Heap

              620000              NT Heap
              ad0000              NT Heap
             2480000              NT Heap
             2630000              NT Heap
             2720000              NT Heap
             29c0000              NT Heap
             2710000              NT Heap
             2aa0000              NT Heap
             2c90000              NT Heap
             36c0000              NT Heap
0:000> !heap -x 0x036c05c8 
Entry     User      Heap      Segment       Size  PrevSize  Unused    Flags
-----------------------------------------------------------------------------
036c05c0  036c05c8  036c0000  036c0000        28       118        1f  busy extra fill 

0:000> !heap -a 036c0000        
Index   Address  Name      Debugging options enabled
 10:   036c0000 
    Segment at 036c0000 to 036cf000 (00001000 bytes committed)
    Flags:                40001062
    ForceFlags:           40000060
    Granularity:          8 bytes
    Segment Reserve:      00100000
    Segment Commit:       00002000
    DeCommit Block Thres: 00000200
    DeCommit Total Thres: 00002000
    Total Free Size:      0000013f
    Max. Allocation Size: 7ffdefff
    Lock Variable at:     036c0258
    Next TagIndex:        0000
    Maximum TagIndex:     0000
    Tag Entries:          00000000
    PsuedoTag Entries:    00000000
    Virtual Alloc List:   036c009c
    Uncommitted ranges:   036c008c
            036c1000: 0000e000  (57344 bytes)
    FreeList[ 00 ] at 036c00c0: 036c05f0 . 036c05f0  
        036c05e8: 00028 . 009f8 [104] - free

    Segment00 at 036c0000:
        Flags:           00000000
        Base:            036c0000
        First Entry:     036c04a8
        Last Entry:      036cf000
        Total Pages:     0000000f
        Total UnCommit:  0000000e
        Largest UnCommit:00000000
        UnCommitted Ranges: (1)

    Heap entries for Segment00 in Heap 036c0000
         address: psize . size  flags   state (requested size)
        036c0000: 00000 . 004a8 [101] - busy (4a7)
        036c04a8: 004a8 . 00118 [107] - busy (117), tail fill Internal 
        036c05c0: 00118 . 00028 [107] - busy (9), tail fill
        036c05e8: 00028 . 009f8 [104] free fill
        036c0fe0: 009f8 . 00020 [111] - busy (1d)
        036c1000:      0000e000      - uncommitted bytes.
0:000> dd 036c05c0
036c05c0  cebb7a5f 1f00c170 baadf00d baadf00d  --对堆块的默认填充,用户区9个字节
036c05d0  abababee abababab feeefeab feeefeee  --堆尾填充8个ab
036c05e0  00000000 00000000 f6b87b65 0000c156--下一块的HEAP_ENTRY
036c05f0  036c00c0 036c00c0 feeefeee feeefeee --这是一个链表,指针一样,说明目前list为1
036c0600  feeefeee feeefeee feeefeee feeefeee --释放填充
036c0610  feeefeee feeefeee feeefeee feeefeee
036c0620  feeefeee feeefeee feeefeee feeefeee
036c0630  feeefeee feeefeee feeefeee feeefeee
0:000> dt _HEAP_ENTRY 036c05c0
ntdll!_HEAP_ENTRY
   +0x000 UnpackedEntry    : _HEAP_UNPACKED_ENTRY
   +0x000 Size             : 0x7a5f  无效数据,乱了。heap -x会帮助解码。长度是28
   +0x002 Flags            : 0xbb ''
   +0x003 SmallTagIndex    : 0xce ''
   +0x000 SubSegmentCode   : 0xcebb7a5f
   +0x004 PreviousSize     : 0xc170
   +0x006 SegmentOffset    : 0 ''
   +0x006 LFHFlags         : 0 ''
   +0x007 UnusedBytes      : 0x1f ''
   +0x000 ExtendedEntry    : _HEAP_EXTENDED_ENTRY
   +0x000 FunctionIndex    : 0x7a5f
   +0x002 ContextValue     : 0xcebb
   +0x000 InterceptorValue : 0xcebb7a5f
   +0x004 UnusedBytesLength : 0xc170
   +0x006 EntryOffset      : 0 ''
   +0x007 ExtendedBlockSignature : 0x1f ''
   +0x000 Code1            : 0xcebb7a5f
   +0x004 Code2            : 0xc170
   +0x006 Code3            : 0 ''
   +0x007 Code4            : 0x1f ''
   +0x004 Code234          : 0x1f00c170
   +0x000 AgregateCode     : 0x1f00c170`cebb7a5f
0:000> !gflag
Current NtGlobalFlag contents: 0x00000070
    htc - Enable heap tail checking --所以末尾填充8个字节的ab,ab
    hfc - Enable heap free checking
    hpc - Enable heap parameter checking
每个堆块都有额外开销,比如上面我们申请了9个字节,实际分了40个字节

第一个错误:tail检查出错

执行几个循环,已经要到边界了,尾巴将被覆盖。
覆盖到最后一个时出错了:
0:000> p
HEAP[FreCheck.exe]: Heap block at 036C05C0 modified at 036C05D1 past requested size of 9
WARNING: This break is not a step/trace completion.
The last command has been cleared to prevent
accidental continuation of this unrelated event.
Check the event, location and thread before resuming.
(3e20.472c): Break instruction exception - code 80000003 (first chance)
eax=00380000 ebx=036c05d1 ecx=0062453c edx=0019f4a0 esi=036c05c0 edi=00000009
eip=77d94143 esp=0019f618 ebp=0019f628 iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202
ntdll!RtlpCheckBusyBlockTail+0x1ae:
77d94143 cc              int     3
0:000> k
 # ChildEBP RetAddr      
00 0019f628 77d4ea6a     ntdll!RtlpCheckBusyBlockTail+0x1bd
01 0019f63c 77d96593     ntdll!RtlpValidateHeapEntry+0x789bb
02 0019f69c 77cff846     ntdll!RtlDebugFreeHeap+0xc6
03 0019f7d8 77d40add     ntdll!RtlpFreeHeap+0xd6
04 0019f834 77cff706     ntdll!RtlpFreeHeapInternal+0x796
05 0019f854 00b51912     ntdll!RtlFreeHeap+0x46
06 0019f958 00b52183     FreCheck!main+0x92 [C:\cpp\vc2022\FreCheck\FreCheck.cpp @ 12] 
07 0019f978 00b51fca     FreCheck!invoke_main+0x33 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 78] 
08 0019f9d4 00b51e5d     FreCheck!__scrt_common_main_seh+0x15a [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 288] 
09 0019f9dc 00b52208     FreCheck!__scrt_common_main+0xd [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 331] 
0a 0019f9e4 76907ba9     FreCheck!mainCRTStartup+0x8 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp @ 17] 
0b 0019f9f4 77d1c10b     KERNEL32!BaseThreadInitThunk+0x19
0c 0019fa4c 77d1c08f     ntdll!__RtlUserThreadStart+0x2b
0d 0019fa5c 00000000     ntdll!_RtlUserThreadStart+0x1b
0:000> !heap -x 0x036c05c8 
Entry     User      Heap      Segment       Size  PrevSize  Unused    Flags
-----------------------------------------------------------------------------
036c05c0  036c05c8  036c0000  036c0000        28       118        1f  busy extra fill 
还是BUSY,没有释放。释放之前的检查堆出错了RtlpCheckBusyBlockTail
 

手工出发检查:

0:000> !heap 036c0000  -v
Index   Address  Name      Debugging options enabled
 10:   036c0000 
    Segment at 036c0000 to 036cf000 (00001000 bytes committed)
    Flags:                40001062
    ForceFlags:           40000060
    Granularity:          8 bytes
    Segment Reserve:      00100000
    Segment Commit:       00002000
    DeCommit Block Thres: 00000200
    DeCommit Total Thres: 00002000
    Total Free Size:      0000013f
    Max. Allocation Size: 7ffdefff
    Lock Variable at:     036c0258
    Next TagIndex:        0000
    Maximum TagIndex:     0000
    Tag Entries:          00000000
    PsuedoTag Entries:    00000000
    Virtual Alloc List:   036c009c
    Uncommitted ranges:   036c008c
    FreeList[ 00 ] at 036c00c0: 036c05f0 . 036c05f0   (1 block )

    Heap block at 036c05c0 modified at 036c05d1 past requested size of 9 (5 * 8 - 1f)
##The above errors were found in segment at 0x036C0000


第二个错误:堆块释放出错

0:000> g
HEAP[FreCheck.exe]: Invalid address specified to RtlFreeHeap( 036C0000, 036C05C8 )
(3e20.472c): Break instruction exception - code 80000003 (first chance)
eax=00380000 ebx=036c05c0 ecx=0062453c edx=0019f4c0 esi=036c0000 edi=00000000
eip=77d4eace esp=0019f630 ebp=0019f63c iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202
ntdll!RtlpValidateHeapEntry+0x78a1f:
77d4eace cc              int     3
0:000> kn
 # ChildEBP RetAddr      
00 0019f63c 77d96593     ntdll!RtlpValidateHeapEntry+0x78a1f
01 0019f69c 77cff846     ntdll!RtlDebugFreeHeap+0xc6
02 0019f7d8 77d40add     ntdll!RtlpFreeHeap+0xd6
03 0019f834 77cff706     ntdll!RtlpFreeHeapInternal+0x796
04 0019f854 00b51912     ntdll!RtlFreeHeap+0x46
05 0019f958 00b52183     FreCheck!main+0x92 [C:\cpp\vc2022\FreCheck\FreCheck.cpp @ 12] 
06 0019f978 00b51fca     FreCheck!invoke_main+0x33 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 78] 
07 0019f9d4 00b51e5d     FreCheck!__scrt_common_main_seh+0x15a [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 288] 
08 0019f9dc 00b52208     FreCheck!__scrt_common_main+0xd [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 331] 
09 0019f9e4 76907ba9     FreCheck!mainCRTStartup+0x8 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp @ 17] 
0a 0019f9f4 77d1c10b     KERNEL32!BaseThreadInitThunk+0x19
0b 0019fa4c 77d1c08f     ntdll!__RtlUserThreadStart+0x2b
0c 0019fa5c 00000000     ntdll!_RtlUserThreadStart+0x1b

最终堆被destroy

0:000> !heap
        Heap Address      NT/Segment Heap

              620000              NT Heap
              ad0000              NT Heap
             2630000              NT Heap
             29c0000              NT Heap
这种检查不是实时的,释放时才发现有问题。

要想实时,就用页堆

原理时放到页尾,搞一个栅栏页,覆盖到了栅栏就实时触发中断。


周六学习辛苦,页堆的详细情况,且听下回分解。

相关文章:

软件调试纵横谈-17-win32堆的调试支持

17.Win32堆的调试支持_哔哩哔哩_bilibili 继续边看录像边做实验。 堆上的内存时用size表达的&#xff0c;组成一个链表。 创建一个FreCheck应用 上次看heap&#xff0c;直接使用下载的文件&#xff0c;本次要做实验了&#xff0c;就需要自己动手&#xff0c;搞个VC proje…...

CANoe CAPL TCP DoIP通信问题

目录 问题Class: TcpSocketdemo示例client注释掉配置TCP/IP stack改demo代码过滤IP,与需要的IP建立连接问题 使用CANoe进行DoIP通信时,如果是标准的DoIP节点,可以使用DoIP相关函数进行通信。 以下两篇文章是按照此方式实现的。 十六、DoIP诊断通信 1 (专栏:从零开始搭建…...

理解 plank 自动生成的 copyWithBlock: 方法

当你使用 plank 命令自动生成一个类时 ./plank --objc_class_prefix=PUG --no_runtime --no_recursive user.json分析 在 JSON 目录下, 执行如上命令后, 生成的 PUGUser 对象, 会自带 copyWithBlock: 方法, 这个方法是用来做什么的 ? copyWithBlock: (注意末尾有一个冒号,因…...

FreeCAD源码分析: Transaction实现原理

本文阐述FreeCAD中Transaction的实现原理。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 注2&#xff1a;文章内容会不定期更新。 一、概念 Ref. from What is a Transaction? A transaction is a group of operations that have the f…...

黑马点评-用户登录

文章目录 用户登录发送短信验证码注册/登录校验登录 用户登录 发送短信验证码 public Result sendCode(String phone, HttpSession session) {// 1.校验手机号if (RegexUtils.isPhoneInvalid(phone)) {// 2.如果不符合&#xff0c;返回错误信息return Result.fail("手机…...

OpenAI新发布Codex的全面解析

一 . 介绍 人工智能技术的飞速发展正在重塑各行各业的运作方式&#xff0c;特别是在软件工程领域。随着生成式AI模型能力的不断提升&#xff0c;代码生成与软件开发领域正经历一场前所未有的变革。OpenAI作为人工智能领域的领军企业&#xff0c;其每一次技术突破都备受全球科技…...

【AI算法工程师面试指北】ResNet为什么用avgpool结构?

在ResNet&#xff08;残差网络&#xff09;中&#xff0c;最后使用平均池化&#xff08;AvgPool&#xff09;结构主要有以下几个关键原因&#xff0c;这些设计与网络的效率、性能和泛化能力密切相关&#xff1a; 1. 减少参数与计算量&#xff0c;避免过拟合 替代全连接层的冗…...

单调栈和单调队列

一、单调栈 1、使用场景 解决元素左 / 右侧第一个比他大 / 小的数字。 2、原理解释 用栈解决&#xff0c;目标是栈顶存储答案。 以元素左侧第一个比他小为例&#xff1a; &#xff08;1&#xff09;遍历顺序一定是从左向右。 &#xff08;2&#xff09;由于栈顶一定是答…...

DeepSeek-R1 Supervised finetuning and reinforcement learning (SFT + RL)

DeepSeek-R1Supervised finetuning and reinforcement learning (SFT RL) 好啊&#xff0c;我们今天的直播会非常透彻的跟大家系统性的分享一下整个agents AI就大模型智能体系统和应用程序。我们在做开发的时候&#xff0c;或者实际做企业级的产品落地的时候&#xff0c;你必…...

【部署】读取excel批量导入dify的QA知识库

回到目录 【部署】读取excel批量导入dify的QA知识库 0. 背景 dify的知识库支持QA模式&#xff0c;分段效果不算太理想&#xff0c;在我们的项目里面&#xff0c;手工编辑高质量QA文档&#xff0c;没有办法批量导入系统。 项目dify_import&#xff0c;支持读取excel文件批量导…...

Scanner对象

文章目录 Scanner对象基本语法使用next()接受使用nextLine()接受小案例总结 Scanner对象 java给我们提供了一个工具类&#xff0c;我们可以获取用户的输入 java.util.Scanner是java5的新特性&#xff0c;我们可以通过Scanner类来获取用户的输入 基本语法 Scanner s new Sc…...

Java 面向对象详解和JVM底层内存分析

先关注、点赞再看、人生灿烂&#xff01;&#xff01;&#xff01;&#xff08;谢谢&#xff09; 神速熟悉面向对象 表格结构和类结构 我们在现实生活中&#xff0c;思考问题、发现问题、处理问题&#xff0c;往往都会用“表格”作为工具。实际上&#xff0c;“表格思维”就是…...

PIC16F18877 ADC 代码

这段代码是为PIC16F18877微控制器设计的嵌入式系统程序,主要实现了LCD显示屏控制、DHT11温湿度传感器数据采集和ADC模拟量读取三大功能。程序通过配置32MHz内部时钟源初始化系统,使用4位数据总线驱动LCD显示模块,定时读取DHT11传感器获取温湿度数据并校验,同时通过ADC通道采…...

Visual Studio2022跨平台Avalonia开发搭建

由于我已经下载并安装了 VS2022版本&#xff0c;这里就跳过不做阐述。 1.安装 Visual Studio 2022 安装时工作负荷Tab页勾选 ‌“.NET 桌面开发”‌ 和“Visual Studio扩展开发”‌ &#xff0c;这里由于不是用的微软的MAUI&#xff0c;所以不用选择其他的来支持跨平台开发&a…...

灵光一现的问题和常见错误1

拷贝构造函数显式写&#xff0c;编译器还会自动生成默认构造函数吗&#xff0c;还有什么函数会出现这种问题 在C中&#xff0c;当类显式定义某些特殊成员函数时&#xff0c;编译器可能不再自动生成其他相关函数。以下是详细分析&#xff1a; I. 显式定义拷贝构造函数对默认构造…...

React学习(二)-变量

也是很无聊,竟然写这玩意,毕竟不是学术研究,普通工作没那么多概念性东西,会用就行╮(╯▽╰)╭ 在React中,变量是用于存储和管理数据的基本单位。根据其用途和生命周期,React中的变量可以分为以下几类: 1. 状态变量(State) 用途:用于存储组件的内部状态,状态变化会触…...

我的世界模组开发——特征(2)

原版代码 AbstractHugeMushroomFeature 以下是对AbstractHugeMushroomFeature类代码的逐段解析,结合Minecraft游戏机制和蘑菇形态学特征进行说明: 1. 类定义与继承关系 public abstract class AbstractHugeMushroomFeature extends Feature<HugeMushroomFeatureConfigu…...

中国30米年度土地覆盖数据集及其动态变化(1985-2022年)

中文名称 中国30米年度土地覆盖数据集及其动态变化(1985-2022年) 英文名称&#xff1a;The 30 m annual land cover datasets and its dynamics in China from 1985 to 2022 CSTR:11738.11.NCDC.ZENODO.DB3943.2023 DOI 10.5281/zenodo.8176941 数据共享方式&#xff1a…...

2000 元以下罕见的真三色光源投影仪:雷克赛恩Cyber Pro1重新定义入门级投影体验

当性价比遇上技术瓶颈 在 2000元以下的1080P投影仪&#xff0c;单LCD 技术长期主导。而三色光源的DLP和3LCD真1080P都在4000元以上。 单LCD投影为纯白光光源&#xff0c;依赖CF滤光膜导致光效低下&#xff0c;普遍存在" 色彩失真 " 等问题。数据显示&#xff0c;该价…...

数学复习笔记 19

前言 向量收尾。线代大概是学了一半了。 向量 向量可以认为是一个矩阵。 线性组合 前面加一个系数就可以了。线性组合和线性表示实际上就是一个意思。 线性相关性 实际上就是内部的向量&#xff0c;至少有一个可以用其他向量表示出来。存在一种情况&#xff0c;系数不全…...

信息收集+初步漏洞打点

目标&#xff1a;理解信息收集在渗透测试中的意义&#xff0c;熟悉常用工具用法&#xff0c;完成基本打点测试 一.理论学习&#xff1a; 模块内容说明信息收集分类主动信息收集 vs 被动信息收集目标发现子域名、IP、端口、子站点、目录、接口技术指纹识别Web框架&#xff08;如…...

计算机视觉与深度学习 | Python实现EMD-SSA-VMD-LSTM时间序列预测(完整源码和数据)

EMD-SSA-VMD-LSTM混合模型 一、环境配置与依赖二、数据生成&#xff08;示例数据&#xff09;三、多级信号分解1. 经验模态分解&#xff08;EMD&#xff09;2. 奇异谱分析&#xff08;SSA&#xff09;3. 变分模态分解&#xff08;VMD&#xff09; 四、数据预处理1. 归一化处理2…...

Linux线程同步信号量

什么是信号量&#xff08;Semaphore&#xff09;&#xff1f; 信号量&#xff08;Semaphore&#xff09; 是一种用于线程同步和进程间通信的机制&#xff0c;它用于控制多个线程对共享资源的访问。在 Linux 中&#xff0c;信号量通常用于防止多个线程同时访问有限的资源&#…...

日志系统**

1.设置日志级别 enum LogLevel{TRACE,DEBUG,INFO,WARN,ERROR,FATAL,NUM_LOG_LEVELS,}; 2.日志格式 TimeStamp 级别 内容 [2025-05-17 20:32:41][ERROR]This is an error message 3.输出&#xff1a;控制台/文件 4.注意 #include <chrono> #include <iomanip&g…...

【C++】18.二叉搜索树

由于map和set的底层是红黑树&#xff0c;同时后面要讲的AVL树(高度平衡二叉搜索树)&#xff0c;为了方便理解&#xff0c;我们先来讲解二叉搜索树&#xff0c;因为红黑树和AVL树都是在二叉搜索树的前提下实现的 在之前的C语言数据结构章节中&#xff0c;我们讲过二叉树&#x…...

刘家祎双剧收官见证蜕变,诠释多面人生

近期&#xff0c;两部风格迥异的剧集迎来收官时刻&#xff0c;而青年演员刘家祎在《我家的医生》与《无尽的尽头》中的精彩演绎&#xff0c;无疑成为观众热议的焦点。从温暖治愈的医疗日常到冷峻深刻的少年救赎&#xff0c;他以极具张力的表演&#xff0c;展现出令人惊叹的可塑…...

python + streamlink 下载 vimeo 短视频

1. 起因&#xff0c; 目的: 看到一个视频&#xff0c;很喜欢&#xff0c;想下载。https://player.vimeo.com/video/937787642 2. 先看效果 能下载。 3. 过程: 因为我自己没头绪。先看一下别人的例子&#xff0c; 问一下 ai 或是 google问了几个来回&#xff0c;原来是流式…...

18-总线IIC

一、IIC 1、IIC概述 I2C(IIC,Inter&#xff0d;Integrated Circuit),两线式串行总线,由PHILIPS&#xff08;飞利浦&#xff09;公司开发用于连接微控制器及其外围设备。 它是由数据线SDA和时钟SCL构成的串行总线&#xff0c;可发送和接收数据。在CPU与被控IC之间、IC与IC之间…...

【深度学习-Day 12】从零认识神经网络:感知器原理、实现与局限性深度剖析

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

力扣HOT100之二叉树:98. 验证二叉搜索树

这道题之前也刷过&#xff0c;自己做了一遍&#xff0c;发现卡在了第70多个样例&#xff0c;才发现自己没有利用二叉搜索树的性质&#xff0c;但凡涉及到二叉搜索树&#xff0c;应该首先考虑中序遍历&#xff01;&#xff01;&#xff01; 被卡住的测试样例是这样的&#xff1a…...

vector(c++)

前言 正式进入学习STL的第一步就是vector容器&#xff0c; vector是一种用于存储可变大小数组的序列容器&#xff0c;就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。本质上讲&#xff0c;vector使用动态分配数组来存储它的元素。底层是一个顺序表。本文介绍…...

CAPL Class: TcpSocket (此类用于实现 TCP 网络通信 )

目录 Class: TcpSocketacceptopenclosebindconnectgetLastSocketErrorgetLastSocketErrorAsStringlistenreceivesendsetSocketOptionshutdown函数调用的基本流程服务器端的基本流程客户端的基本流程Class: TcpSocket学习笔记。来自CANoe帮助文档。 Class: TcpSocket accept /…...

C语言:gcc 如何调用 Win32 打开文件对话框 ?

在 Windows 平台上使用 gcc 调用原生 Win32 API 实现文件打开对话框是可行的&#xff0c;但需要直接使用 Win32 的 GetOpenFileName 函数&#xff08;位于 commdlg.h 头文件&#xff0c;依赖 comdlg32.lib 库&#xff09;。以下是完整实现步骤和代码示例&#xff1a; 编写 file…...

OpenHarmony:开源操作系统重塑产业数字化底座

OpenHarmony&#xff1a;开源操作系统重塑产业数字化底座 引言&#xff1a;当操作系统成为数字公共品 在万物智联时代&#xff0c;操作系统不再是科技巨头的专属领地。华为捐赠的OpenHarmony项目&#xff0c;正以开源协作模式重构操作系统产业格局。这个脱胎于商业版本的开源…...

线程同步学习

概念 有A、B、C三个线程&#xff0c;A线程负责输入数据&#xff0c;B线程负责处理数据、C线程负责输出数据&#xff0c;这三个线程之间就存在着同步关系&#xff0c;即A必须先执行&#xff0c;B次之&#xff0c;C最后执行&#xff0c;否则不能得到正确的结果。 那么所谓线程同…...

十二、Hive 函数

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月17日 专栏&#xff1a;Hive教程 在数据处理的广阔天地中&#xff0c;我们常常需要对数据进行转换、计算、清洗或提取特定信息。Hive 提供了强大的内置运算符和丰富的内置函数库&#xff0c;它们就像魔法师手中的魔法棒&…...

DeepSeek 赋能社会科学:解锁研究新范式

目录 一、DeepSeek&#xff1a;大语言模型中的新力量1.1 DeepSeek 技术亮点1.2 与其他模型对比 二、DeepSeek 在社会科学研究中的应用领域2.1 经济学研究2.2 社会学研究2.3 历史学研究2.4 法学研究 三、DeepSeek 应用案例深度剖析3.1 案例一&#xff1a;社会学研究中社会舆情分…...

java函数内的变量问题

public class VendingMachine {//设计一个类叫做VendingMachine,用这个类制造一个对象vmint price 80;int balance;//三个属性int total;void showprompt(){System.out.println("Welcome");}void insertmoney(int amount){balance balance amount;}void showBalan…...

docker部署第一个Go项目

1.前期准备 目录结构 main.go package mainimport ("fmt""github.com/gin-gonic/gin""net/http" )func main() {fmt.Println("\n .::::.\n .::::::::.\n :::::::::::\n …...

【读代码】端到端多模态语言模型Ultravox深度解析

一、项目基本介绍 Ultravox是由Fixie AI团队开发的开源多模态大语言模型,专注于实现音频-文本的端到端实时交互。项目基于Llama 3、Mistral等开源模型,通过创新的跨模态投影架构,绕过了传统语音识别(ASR)的中间步骤,可直接将音频特征映射到语言模型的高维空间。 核心优…...

管理前端项目依赖版本冲突导致启动失败的问题的解决办法

管理前端项目依赖版本冲突导致启动失败的问题&#xff0c;可按照以下步骤系统解决&#xff1a; 1. 定位冲突来源 查看错误日志&#xff1a;启动失败时的控制台报错通常会指出具体模块或版本问题&#xff0c;例如 Module not found 或 TypeError。检查依赖树&#xff1a;npm l…...

北京市工程技术人才职称评价基本标准条件解读

北京市工程技术人才职称评价基本标准条件 北京市工程技术人才之技术员 北京市工程技术人才之助理工程师 北京市工程技术人才之工程师 北京市工程技术人才之高级工程师 北京市工程技术人才之高级工程师&#xff08;破格&#xff09; 北京市工程技术人才之正高级工程师 北京市工程…...

MUSE Pi Pro 开发板 Imagination GPU 利用 OpenCL 测试

视频讲解&#xff1a; MUSE Pi Pro 开发板 Imagination GPU 利用 OpenCL 测试 继续玩MUSE Pi Pro&#xff0c;今天看下比较关注的gpu这块&#xff0c;从opencl看起&#xff0c;安装clinfo指令 sudo apt install clinfo 可以看到这颗GPU是Imagination的 一般嵌入式中gpu都和hos…...

Mysql数据库之集群进阶

一、日志管理 5.7版本自定义路径时的文件需要自己提前创建好文件&#xff0c;不会自动创建&#xff0c;否则启动mysql会报错 错误日志 rpm包(yum) /var/log/mysql.log 默认错误日志 ###查询日志路径 [rootdb01 ~]# mysqladmin -uroot -pEgon123 variables | grep -w log_e…...

JavaScript防抖与节流全解析

文章目录 前言:为什么需要防抖和节流基本概念与区别防抖(Debounce)节流(Throttle)关键区别防抖(Debounce)详解1. 基本防抖函数实现2. 防抖函数的使用3. 防抖函数的工作流程4. 防抖函数进阶 - 立即执行选项节流(Throttle)详解1. 基本节流函数实现时间戳法(第一次会立即执行)定…...

大模型学习:Deepseek+dify零成本部署本地运行实用教程(超级详细!建议收藏)

文章目录 大模型学习&#xff1a;Deepseekdify零成本部署本地运行实用教程&#xff08;超级详细&#xff01;建议收藏&#xff09;一、Dify是什么二、Dify的安装部署1. 官网体验2. 本地部署2.1 linux环境下的Docker安装2.2 Windows环境下安装部署DockerDeskTop2.3启用虚拟机平台…...

在RK3588上使用NCNN和Vulkan加速ResNet50推理全流程

在RK3588上使用NCNN和Vulkan加速ResNet50推理全流程 前言:为什么需要关注移动端AI推理一、环境准备与框架编译1.1 获取NCNN源码1.2 安装必要依赖1.3 编译NCNN二、模型导出与转换2.1 生成ONNX模型2.2 转换NCNN格式三、模型量化加速3.1 生成校准数据3.2 执行量化操作四、性能测试…...

Web安全基础:深度解析与实战指南

一、Web安全体系架构的全面剖析 1.1 分层防御模型(Defense in Depth) 1.1.1 网络层防护 ​​防火墙技术​​: 状态检测防火墙(SPI):基于连接状态跟踪,阻断非法会话(如SYN Flood攻击)下一代防火墙(NGFW):集成IPS、AV、URL过滤(如Palo Alto PA-5400系列)配置示例…...

Uniapp开发鸿蒙应用时如何运行和调试项目

经过前几天的分享&#xff0c;大家应该应该对uniapp开发鸿蒙应用的开发语法有了一定的了解&#xff0c;可以进行一些简单的应用开发&#xff0c;今天分享一下在使用uniapp开发鸿蒙应用时怎么运行到鸿蒙设备&#xff0c;并且在开发中怎么调试程序。 运行 Uniapp项目支持运行到…...

Python海龟绘图(Turtle Graphics)核心函数和关键要点

以下是Python海龟绘图&#xff08;Turtle Graphics&#xff09;的核心函数和关键要点整理&#xff1a; 一、画布设置 函数/方法说明参数说明备注turtle.setup(width, height, x, y)设置画布尺寸和位置width宽度&#xff0c;height高度&#xff0c;x/y窗口左上角坐标默认尺寸80…...