crash in __tcf_0
crash in __tcf_0
在我们的应用程序中,我们观察到它执行后崩溃。堆栈跟踪显示崩溃是由于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
之后创建的。
- clCreateFromGLBuffer crash
- Protobuf ShortDebugString() crash
- Crash in boost::archive::text_iarchive in_archive {is} boost
- OpenCV Native Android cvtColor crash
- 通过调用 CreateRemoteThread 来弹出 dll:crash
- 获取stacktrace for Crash,而无需在调试器中运行该应用程序
- C++/Qt memcpy crash with QSharedMemory
- SDL_GetRendererInfo crash
- Python Numpy 方法对应于 C++ Eigen make crash
- Tesseract 3.02.02 Crash JRE
- Emscripten crash with mappedGlobals.find(name) != mappedGlob
- 在C 中导入.CSV文件:crash
- Qt threadred QOpenGLWidget crash
- Crash on curl_easy_perform() when uploading a file on CURL i
- 我可以从Crash Signature(Windows Crash Report)获取源代码吗?
- WinAPI EM_STREAMOUT crash
- JVM-Crash 在 JNI 中调用 ReleaseStringUTFChars,仅在 Windows 7 上,Win
- DirectX GetSystemMetrics Crash
- glBindBuffer crash - 使用 glew 实现 VBO
- Cocos2d-x Crash at setResponseCallback in Android