crash in __tcf_0

crash in __tcf_0

本文关键字:tcf crash in      更新时间:2023-10-16

在我们的应用程序中,我们观察到它执行后崩溃。堆栈跟踪显示崩溃是由于cpp文件中存在的全局变量造成的。生成的valgrind报告显示无效的free/read/write错误,这意味着它正在尝试删除一个不再有效的内存。

文件:crash.cpp

namespace abc
{
  MutexClass obj; //A is a class
  // remaining code
  ChildClass::ChildClass():Parent(obj){}
}

然后我们将给定的变量放在一个未命名的命名空间中,我们不再得到崩溃,并且valgrind不会报告无效的读/写/错误:

文件:nocrash.cpp

namespace
{
  MutexClass obj;
}
namespace abc
{
  // remaining code
  ChildClass::ChildClass():Parent(obj){}
}

上面的例子是导致问题的类的简化版本。

我们不确定为什么将变量放在未命名的命名空间中会消除这个问题。它会改变清理命令吗?我们试着编写简单的代码,但是我们观察到两种情况下的清理顺序是相同的。

互斥对象作为参数传递给基类构造函数。互斥对象的唯一用途是在基类构造函数中使用。

互斥对象在代码的其他地方没有使用。

崩溃的valgrind报告

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

线程1:

读取大小为1的文件无效

at 0x3A24C08260: pthread_mutex_destroy (in/lib64/libpthread-2.5.so)

by 0x5ABE3DD: osl_destroyMutex (libuno_sal.so.3)

0 xecd69d1: osl:互斥::~互斥()(mutex.hxx: 65)

0 xef207f5: __tcf_0 ( Dispose.cpp: 27日)

由0x3A24033354: exit (in/lib64/libc-2.5.so)

by 0x3A2401D97A: (below main) (in/lib64/libc-2.5.so)

地址0xeb6bb88在一个大小为40的块中有16个字节

at 0x4A05B3E: free (vg_replace_malloc.c:323)

由0x3A24033354: exit (in/lib64/libc-2.5.so)

by 0x3A2401D97A: (below main) (in/lib64/libc-2.5.so)

写入大小为4的文件无效

at 0x3A24C08272: pthread_mutex_destroy (in/lib64/libpthread-2.5.so)

by 0x5ABE3DD: osl_destroyMutex (in libno_sal .so.3)

0 xecd69d1: osl:互斥::~互斥()(mutex.hxx: 65)

0 xef207f5: __tcf_0 ( Dispose.cpp: 27日)

由0x3A24033354: exit (in/lib64/libc-2.5.so)

by 0x3A2401D97A: (below main) (in/lib64/libc-2.5.so)

地址0xeb6bb88在一个大小为40的块中有16个字节

at 0x4A05B3E: free (vg_replace_malloc.c:323)

由0x3A24033354: exit (in/lib64/libc-2.5.so)

by 0x3A2401D97A: (below main) (in/lib64/libc-2.5.so)

无效的free()/删除/删除[]

at 0x4A05B3E: free (vg_replace_malloc.c:323)

0 xecd69d1: osl:互斥::~互斥()(mutex.hxx: 65)

0 xef207f5: __tcf_0 ( Dispose.cpp: 27日)

由0x3A24033354: exit (in/lib64/libc-2.5.so)

by 0x3A2401D97A: (below main) (in/lib64/libc-2.5.so)

地址0xeb6bb78在一个大小为40的块中是0字节

at 0x4A05B3E: free (vg_replace_malloc.c:323)

由0x3A24033354: exit (in/lib64/libc-2.5.so)

by 0x3A2401D97A: (below main) (in/lib64/libc-2.5.so)

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

Dispose.cpp:27行定义了互斥变量。

我们将非常感谢对此事的任何帮助

谢谢,

Sudeep

检查您的其他文件。您可能在名称空间abc中有另一个名为obj的全局变量。更改为未命名的名称空间与C中的静态名称空间具有相同的效果,从而避免了名称冲突(如果可能发生这种情况,任何其他与abc不同的名称空间也会阻止该问题)。这种错误通常会导致链接错误,但有时也会发生奇怪的事情。

请注意,全局变量,不会被其他文件使用,应该在未命名的命名空间,以避免名称冲突。

您给我们看的代码没有问题。

也许问题是与类A ?

您的变量是否使用带有下划线开头的名称?

如果是这样的话,那么你遇到麻烦是很正常的。

带有首字母下划线的全局名称是保留的,不应该使用。在任何上下文中,也可以使用首字母下划线后跟大写字母的名称,或者使用多个连续下划线的名称。

这是一个规则,我不太理解的原因,经常被许多程序员打破,只是为了这样做的乐趣…

像您那样移动代码将重新排序A相对于同一翻译单元中的其他全局变量的构造和销毁。如果您之前创建了A,稍后会删除它。(后进先出原则)。其他物体现在可以依赖A。检查哪些对象是在 A之前创建的,现在是在A之后创建的。