Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 在ntdll内使用gdb调试时,不知从何处出现断点 我做了一个非常简单的程序,它为我自动化了一些东西。我用C++编写它,它在Windows上运行。在代码块IDE内部使用GDB进行调试时,我不知从哪里得到了许多断点。我不知道是什么导致了这个问题。断点似乎与内存问题有关。。。自从我修复了检测到的内存泄漏后,断点的数量明显减少了_Debugging_Gdb - Fatal编程技术网

Debugging 在ntdll内使用gdb调试时,不知从何处出现断点 我做了一个非常简单的程序,它为我自动化了一些东西。我用C++编写它,它在Windows上运行。在代码块IDE内部使用GDB进行调试时,我不知从哪里得到了许多断点。我不知道是什么导致了这个问题。断点似乎与内存问题有关。。。自从我修复了检测到的内存泄漏后,断点的数量明显减少了

Debugging 在ntdll内使用gdb调试时,不知从何处出现断点 我做了一个非常简单的程序,它为我自动化了一些东西。我用C++编写它,它在Windows上运行。在代码块IDE内部使用GDB进行调试时,我不知从哪里得到了许多断点。我不知道是什么导致了这个问题。断点似乎与内存问题有关。。。自从我修复了检测到的内存泄漏后,断点的数量明显减少了,debugging,gdb,Debugging,Gdb,gdb告诉我的确切情况是: Program received signal SIGTRAP, Trace/breakpoint trap. In ntdll!TpWaitForAlpcCompletion () (C:\Windows\system32\ntdll.dll) 我在我的程序中多次遇到这种情况。我认为我可能做了一些非常错误的事情,即使程序似乎运行得很好,它完成了我想要它做的事情。谁能告诉我出了什么问题,因为我不知道该去哪里找?如果这不是问题,那么有人知道如何禁用它,因为这会阻止

gdb告诉我的确切情况是:

 Program received signal SIGTRAP, Trace/breakpoint trap.
 In ntdll!TpWaitForAlpcCompletion () (C:\Windows\system32\ntdll.dll)
我在我的程序中多次遇到这种情况。我认为我可能做了一些非常错误的事情,即使程序似乎运行得很好,它完成了我想要它做的事情。谁能告诉我出了什么问题,因为我不知道该去哪里找?如果这不是问题,那么有人知道如何禁用它,因为这会阻止我到达我自己设置的断点吗

提前谢谢

编辑:(添加GDB的where命令的输出): 我在哪里可以检查这些函数的功能,以便了解我做错了什么

#0  0x76fefadd in ntdll!TpWaitForAlpcCompletion () from C:\Windows\system32\ntdll.dll
#1  0x0028e894 in ?? ()
#2  0x76fb272c in ntdll!RtlCreateUserStack () from C:\Windows\system32\ntdll.dll
#3  0x00657fb8 in ?? ()
#4  0x00657fb8 in ?? ()
#5  0x76f4b76a in ntdll!RtlDowncaseUnicodeChar () from C:\Windows\system32\ntdll.dll
#6  0x02070005 in ?? ()
#7  0x00000b10 in ?? ()
#8  0x0028e8dc in ?? ()
#9  0x76ff0b37 in ntdll!TpQueryPoolStackInformation () from C:\Windows\system32\ntdll.dll
#10 0x038b0000 in ?? ()
#11 0x00657fb8 in ?? ()
#12 0x76f4b76a in ntdll!RtlDowncaseUnicodeChar () from C:\Windows\system32\ntdll.dll
#13 0x6e6e9a5e in ?? ()
#14 0x038b0000 in ?? ()
#15 0x038b0000 in ?? ()
#16 0x00000000 in ?? ()

我建议使用WinDBG,这是本机windows调试器。这将提供更好的堆栈跟踪,特别是当它转换到内核模式时的符号。

哇,你让我回到5年前我在linux平台上使用gdb的时候:)

您可以使用以下命令防止gdb在接收SIGTRAP时中断:

handle SIGTRAP nostop

但我和史蒂夫在一起,试试WinDbg吧。它是专门为windows构建的。

虽然这个问题现在已经很老了,但以下几点可能会对像我这样的搜索者有所帮助:

我在Win7上测试时遇到了这个问题,Win7是我在WinXP上开发的一个应用程序。在我的例子中,它既与Windows 7内存管理监控有关,也与我的应用程序内存分配不正确有关

简而言之,在应用程序代码中,一个内存块被错误处理(而不是使用
GlobalAlloc()
),并被
GlobalFree()
释放(这是错误的,因为系统堆是用C运行时内存池中的指针访问的)。虽然这会导致内存泄漏(在这种情况下非常小),但在WinXP上测试时完全没有注意到,整个程序显然运行正常

现在,当在Win7上执行时,名为(FTH)的内存监控功能检测到应用程序的此错误(导致异常):

  • 同时,它通过
    OutputDebugString()
    (或者可能是
    DbgPrint()
    )输出一些信息,这些信息可以使用简单工具查看,或者在跟踪应用程序时由任何调试器查看。因此,在收到信号之前,您可以在消息中看到类似的内容:

    警告:HEAP[您的.exe的名称]:

    警告:为RtlFreeHeap(006B0000、006A3698)指定的地址无效

  • 并且(在应用程序正在调试的情况下)它输出一个断点,该断点在调试器之外没有任何效果,但其他断点应该有助于指出问题该断点由GDB显示为SIGTRAP信号

此时,您有两种选择:

  • 尝试遍历调用堆栈以在代码中找到错误的指令(不幸的是,在这种情况下,
    bt
    where
    gdb命令无法显示足够远的距离来查看堆在我的代码中被错误释放的位置-如果有人知道如何从启动模块而不是ntdll显示正确的调用堆栈,请告诉我
  • 尝试继续,因为FTH能够自动修补内存中的错误(该自动修补程序也可以在下次运行应用程序时提前进行)
正如Moshe Levi所说,为了避免在堆问题发生时停止,您可以在启动应用程序之前在GDB提示符处设置一个
句柄SIGTRAP nostop


简而言之:是的,与内存管理相关的代码中确实存在一些错误,但在某些情况下,它可以运行而不会崩溃。但在调试模式下,内核试图将您置于问题的路径上。

我刚刚使用gcc/mingw和Qt Creator遇到了这种崩溃

我也有其他问题,包括变量似乎是错误的(偏移6字节)。 在我的例子中,结果是一个pragma包对代码造成了严重破坏

我有这个:

#pragma pack(1)
typedef struct SomeStruct
{
... // structure
} SomeStruct;
…但我没有使用pragma pack()调用来终止它,以在结构后结束1的打包并返回默认的字节对齐/打包。添加该命令修复了它:

#pragma pack(1)
typedef struct SomeStruct
{
... // structure
} SomeStruct;
#pragma pack() // <<-- with this line the heap corruption problem was stopped
#pragma包(1)
typedef结构SomeStruct
{
…//结构
}SomeStruct;

#pragma pack()//当您得到一个SIGTRAP时,调用堆栈的其余部分是什么样子的?请发布GDB“where”命令的输出。谢谢您的回复,我将附加“where”的输出在问题中。现在编辑…你认为在哪里可以得到一个免费的WinDbg?既然它只随Visual Studio带来,我怀疑有人会因为调试器而购买它,这甚至不是更好的gdb。但是⁺无论如何:我甚至没有注意到系统库中的断点会导致另一个信号,与通常的中断不同。WinDbg是免费的,是Windows调试工具包的一部分。您可以从下载它。我想补充的是,代码似乎并不总是错的。我有一个非常类似的问题,并看到一个警告
Heap b锁定在003E5E78,修改为003E5EBA,超过了请求的3a大小
。我甚至发现触发警告的位置错误,代码看起来很好:我用«新建»创建了«wchar_t»数组,然后用«删除【】释放它»。可能是MinGW.Btw中的一个bug,有一件事间接证实了这一点:我使用valgrind在GNU/Linux上测试了该应用程序,但它没有发现任何问题。