【问题标题】:Why the pointer's value changes in multi-thread malloc?为什么在多线程malloc中指针的值会发生变化?
【发布时间】:2013-03-14 04:39:40
【问题描述】:
  1. 大家好,我遇到了一个非常奇怪的问题。你有什么想法吗 分段故障?任何意见,将不胜感激!提前谢谢!

测试()

{

pMsg_node = found_bakup_msg_node();

if(pMsg_node != NULL) {
    Dprintf("#%s#%d %p\n", __FUNCTION__, __LINE__, pMsg_node); 
    ret = cp_msg_node_data(pMsg_node, pMsg_next);
}

}

================================================ =====================

struct MSG_INFO* found_bakup_msg_node(void) { 结构 MSG_INFO* msg_node = NULL;

    msg_node = (struct MSG_INFO*)malloc(sizeof(struct MSG_INFO));
    if(msg_node != NULL) {
            memset(msg_node, 0x0, sizeof(struct MSG_INFO));

            Dprintf("#%s# %p\n", __FUNCTION__,
                             msg_node);
    }

    return msg_node;

}

================================================ =========

---------------日志 1------ --------------

> header=0x923950    
>found_bakup_msg_node#alloc_bakup_count=1 0x7f6090032f70 //return from malloc() 
>cp_msg_list#561
> cp_msg_node_data#458   
>cp_msg_node_data#463 0xffffffff90032f70  0x923950  //notice here
>Segmentation fault
> robin@robin-desktop:/media/work/project/rcd$    

--------------日志 2 ------- -------------

 #cp_msg_list#566
#found_bakup_msg_node#alloc_bakup_count=180 **0x7fe6e000d5b0**
#cp_msg_node_data#464 **0xffffffffe000d5b0** 0x2154620
Segmentation fault
robin@robin-desktop:/media/work/project/rcd$

【问题讨论】:

  • 操作系统:uname -a Linux robin-desktop 2.6.32-38-generic #83-Ubuntu SMP Wed Jan 4 11:12:07 UTC 2012 x86_64 GNU/Linux
  • gcc -v 使用内置规范。目标:x86_64-linux-gnu 配置:../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5.1' --with-bugurl=file:///usr/share/doc /gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 ... ...线程模型:posix gcc 4.4.3版(Ubuntu 4.4.3-4ubuntu5.1)
  • 停止投射 malloc()。它是 C,而不是 C++。它甚至可以帮助您追踪错误。因为我们无法按原样编译/测试它,所以有太多的片段无法全部完成。如果您可以将代码减少到更小的部分并且仍然存在段错误,您可能会很快自己找到它。由于您是 Linux,因此您可能也应该尝试使用 -pthread 而不是 -lpthread。

标签: c multithreading malloc


【解决方案1】:

你试过在 gdb 下运行程序吗?它通常会显示您遇到分段错误的原因,并且通常有助于学习如何使用 gdb。

【讨论】:

  • 正在尝试...,谢谢 bgeron!我猜从 addr 0x2154620 到 addr 0xffffffffe000d5b0 的 memcpy 数据会导致分段错误。
  • 已修复。因为Test()在declare之前调用了found_bakup_msg_node(void),所以返回值默认应该是32bit。当返回值 > 32bit 时,系统会自动补全基于最高位的值,如 0x0000 0000 1111 1111 或 0xffff ffff 1111 1111。
  • @user2203111 如果您发现错误,请将其发布为您问题的答案。
  • 解决方法是:在调用前只需在header中声明api,调用者默认不会自动补全返回地址。这个问题不应该在 32 位系统中发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 2016-01-06
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 2014-11-21
相关资源
最近更新 更多