"AllK required contiguous memory" gdb 中是什么意思?



在Windows 10下的MINGW64中使用gdb调试的程序上,我收到以下警告:

gdb --args ./myprogram.exe
GNU gdb (GDB) 12.1
...
Reading symbols from ./myprogram.exe...
(gdb) r
Starting program: C:testmyprogram.exe
[New Thread 11460.0x4e38]
[New Thread 11460.0x4a60]
[New Thread 11460.0x2eac]
warning:
warning: AllK required contiguous memory = 675016 (64bit)
warning:   8 HotK Handles: HandleSize 2112 PoolSize 16912 (bytes)
warning:   64 LstK Handles: HandleSize 64 PoolSize 4112 (bytes)
warning:   2048 LstInfoK Handles: HandleSize 64 PoolSize 131088 (bytes)
warning:   128 UsbK Handles: HandleSize 96 PoolSize 12304 (bytes)
warning:   64 DevK Handles: HandleSize 112 PoolSize 7184 (bytes)
warning:   2048 OvlK Handles: HandleSize 104 PoolSize 213008 (bytes)
warning:   64 OvlPoolK Handles: HandleSize 96 PoolSize 6160 (bytes)
warning:   32 StmK Handles: HandleSize 176 PoolSize 5648 (bytes)
warning:   2048 IsochK Handles: HandleSize 136 PoolSize 278544 (bytes)
warning:
warning: Dynamically allocated as needed:
warning:        KLST_DEVINFO = 2596 bytes each
[New Thread 11460.0x24bc]
...

这"在哪里;横幅";带有";警告:AllK需要连续存储器";它是gdb打印出来的东西,还是底层的Windows系统dll?

这意味着什么?为什么这是一个警告?

例如,如果它说";警告:AllK所需的连续存储器=675016(64位("-为什么这是一个警告?675016字节的连续内存太多了吗?如果是,限制是多少?

我的猜测是"AllK";可能是指所有内核对象(或句柄?(,所以这可能与驱动程序(内核对象(有关;但是,最好确切地知道这意味着什么(而不是用"可能"来推测(。。。

好吧,我想我找到了它——它来自libusbK驱动程序,特别是在函数LibK_Context_Init中,我们有:

  • https://github.com/mcuee/libusbk/blob/0585dab3/libusbK/src/lusbk_usb.c#L511
...
processHeap = GetProcessHeap();
ErrorMemory(processHeap == NULL, Error);
AllK = HeapAlloc(processHeap, HEAP_ZERO_MEMORY, sizeof(ALLK_CONTEXT));
ErrorMemory(AllK == NULL, Error);
...
// one-time AllK initialize
USBLOG_PRINTLN("");
USBLOG_PRINTLN("AllK required contiguous memory = %u (%sbit)", sizeof(ALLK_CONTEXT), sizeof(PVOID) == 8 ? "64" : "32");
ALLK_DBG_PRINT_SECTION(HotK);
ALLK_DBG_PRINT_SECTION(LstK);
ALLK_DBG_PRINT_SECTION(LstInfoK);
ALLK_DBG_PRINT_SECTION(UsbK);
ALLK_DBG_PRINT_SECTION(DevK);
ALLK_DBG_PRINT_SECTION(OvlK);
ALLK_DBG_PRINT_SECTION(OvlPoolK);
ALLK_DBG_PRINT_SECTION(StmK);
ALLK_DBG_PRINT_SECTION(IsochK);
USBLOG_PRINTLN("");

其中:

#define ALLK_DBG_PRINT_SECTION(AllKSection) 
USBLOG_PRINTLN("  %u %s Handles: HandleSize %u PoolSize %u (bytes)",(sizeof(AllK->AllKSection.Handles)/sizeof(AllK->AllKSection.Handles[0])),DEFINE_TO_STR(AllKSection),sizeof(AllK->AllKSection.Handles[0]), sizeof(AllK->AllKSection))

因此,我的猜测是gdb添加了单词";警告:"-原始libusbK打印输出不包含它;否则,如果内存分配出现问题,那么在打印文本之前,libusbK中的操作就会失败。

我想我现在明白了,但如果有人知道得更好,请发布一个答案。。。

最新更新