【问题标题】:malloc() Crashing everytime || windbg breaks in with nt!DbgLoadImageSymbolsmalloc() 每次都崩溃 || windbg 插入 nt!DbgLoadImageSymbols
【发布时间】:2014-12-05 14:16:54
【问题描述】:
LPTSTR name = NULL;
DWORD nameLength = 0;

namelength = host->nameLength; // returns 10
name =  (LPTSTR) malloc( sizeof(nameLength * sizeof(TCHAR))); //crashes here

我现在不明白它崩溃的原因。有人能解释一下原因吗?

更新=*(删除了崩溃行之后的下一行,是误复制了。只是代码中注释掉的一行)

更新: 对不起,伙计们,在问这个问题之前,我已经尝试了你所描述的所有方法。没用。

我认为这是其他一些问题。这是一个 Windows 服务,在计算机启动时调用上面的函数(从 dll 中),所以使用 windbg 远程调试 dll (我在函数被调用之前使用硬编码的 debugbreak 闯入)。

当我完成 malloc 步骤并给出“下一步”指令 (F10) 时,它不会进入下一步,而是说客户端正在运行,但随后突然在 nt!DbgLoadImageSymbols 处插入“离开”的指示。在此之后执行 go(F5) 会使机器处于挂起状态。

【问题讨论】:

  • 你试过malloc(nameLength * sizeof(TCHAR))吗?
  • 你的 sizeof 太多了。应该是malloc( nameLength * sizeof(TCHAR) )
  • 此外,立即将其他内容分配给name 是没有意义的,从 malloc 中丢弃您刚刚用于的指针。
  • Codor 我不相信这是真的,至少在 C 中不是。
  • 应该是malloc( (nameLength+1) * sizeof(TCHAR) ) 为终结者留出空间。

标签: c windows malloc windbg


【解决方案1】:

如果您在malloc 内部崩溃,则意味着您之前已损坏堆(或更准确地说,是组织堆的双链表)。

考虑到您在这里有一个明显的错误:

name =  (LPTSTR) malloc( sizeof(nameLength * sizeof(TCHAR)));

您应该检查所有 malloc 调用并确保分配了足够的内存。您所做的可能是分配了太小的缓冲区,将太多数据写入返回的指针,从而破坏了堆,然后在稍后对 malloc 的调用中崩溃。

由于您使用的是 Windows,因此您还可以使用 page-heap verification(通过 gflags 工具)。这将帮助您在发生缓冲区覆盖时捕获它们。

【讨论】:

    【解决方案2】:

    没有足够的信息来回答,但太多的评论,对不起。我根据你所看到的线索做了一个简单的main(),之前评论过的任何错误都没有得到纠正,但额外的行仅供参考,分配了多少内存。该程序编译和运行没有任何抱怨。所以你的问题没有被正确表达。

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    int main(){
        LPTSTR name = NULL;
        DWORD nameLength = 10;
        name =  (LPTSTR) malloc( sizeof(nameLength * sizeof(TCHAR)));
        if (name) {
            printf ("Memory for %d bytes allocated\n", sizeof(nameLength * sizeof(TCHAR)));
            free (name);
        } else {
            printf ("No memory for %d bytes\n", sizeof(nameLength * sizeof(TCHAR)));
        }
        return 0;
    }
    

    程序输出:

    Memory for 4 bytes allocated
    

    清楚的是,对于你所说的 10,它不太可能有足够的内存。

    【讨论】:

    • 它完全按照您的方式进行。我不明白!为什么它只为我而崩溃。正是在尝试分配内存时。 malloc 崩溃的不同原因有哪些?它是一个 dll 中的函数,从 Windows 服务调用。
    • “它是一个 dll 中的函数,从 Windows 服务调用。”所以我的简单 main() 不是完全你完成了。我离开这里;-)
    猜你喜欢
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2015-12-29
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多