在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中的操作就会失败。
我想我现在明白了,但如果有人知道得更好,请发布一个答案。。。