demo: cxa_atexit.c:100: __new_exitfn: Assertion `l != NULL' failed. Aborted (core dumped)
时间: 2024-04-21 15:29:13 浏览: 182
这是一个程序运行错误的提示信息,其中包含了文件名、行号和错误信息。根据提示信息,可以知道程序在cxa_atexit.c文件的第100行出现了一个assertion失败,导致程序异常终止,并且生成了一个核心转储文件(core dumped)。
assertion是一种调试技术,它用于在程序中检查某个条件是否满足,如果不满足则触发assertion失败,程序就会异常终止。在这个错误信息中,assertion的条件是'l != NULL',也就是判断指针l是否为空,如果为空则会触发assertion失败,程序就会异常终止。
根据这个错误信息,我们可以进一步查看cxa_atexit.c文件的第100行,看看是什么原因导致了assertion失败。如果无法确定具体原因,可以考虑在程序中添加调试信息,或者使用调试工具进行调试,找出错误的原因并进行修复。
相关问题
#0 0x00007f7bca8661b5 in *__GI_raise (sig=<value optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 #1 0x00007f7bca868f45 in *__GI_abort () at abort.c:121 #2 0x00007f7bcb0fadc5 in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/libstdc++.so.6 #3 0x00007f7bcb0f9166 in ?? () from /usr/lib/libstdc++.so.6 #4 0x00007f7bcb0f9193 in std::terminate() () from /usr/lib/libstdc++.so.6 #5 0x00007f7bcb0f928e in __cxa_throw () from /usr/lib/libstdc++.so.6 #6 0x00007f7bcb0f971d in operator new(unsigned long) () from /usr/lib/libstdc++.so.6 #7 0x00007f7bcd65d51a in __gnu_cxx::new_allocator<SLSZDDX>::allocate (this=0x7fff50282a10, __n=87012943743912979) at /usr/include/c++/4.4/ext/new_allocator.h:89 #8 0x00007f7bcd6542e7 in std::_Vector_base<SLSZDDX, std::allocator<SLSZDDX> >::_M_allocate (this=0x7fff50282a10, __n=87012943743912979) at /usr/include/c++/4.4/bits/stl_vector.h:140 #9 0x00007f7bcd649278 in std::vector<SLSZDDX, std::allocator<SLSZDDX> >::_M_insert_aux (this=0x7fff50282a10, __position=..., __x=...) at /usr/include/c++/4.4/bits/vector.tcc:322 #10 0x00007f7bcd644f81 in std::vector<SLSZDDX, std::allocator<SLSZDDX> >::push_back (this=0x7fff50282a10, __x=...) at /usr/include/c++/4.4/bits/stl_vector.h:741
这是一个代码堆栈,它显示了程序在运行时崩溃的位置和原因。具体来说,它显示了以下信息:
- 在raise.c文件的第64行,程序调用了raise函数来抛出一个信号。
- 在abort.c文件的第121行,程序调用了abort函数来终止程序的执行。
- 在libstdc++.so.6库中,程序调用了__gnu_cxx::__verbose_terminate_handler函数来处理异常终止。
- 在libstdc++.so.6库中,程序调用了std::terminate函数来终止程序的执行。
- 在libstdc++.so.6库中,程序调用了__cxa_throw函数来抛出一个异常。
- 在new_allocator.h文件的第89行,程序调用了operator new函数来分配内存。
- 在stl_vector.h文件的第140行,程序调用了_Vector_base::_M_allocate函数来分配内存。
- 在vector.tcc文件的第322行,程序调用了vector::_M_insert_aux函数来插入一项到vector中。
- 在stl_vector.h文件的第741行,程序调用了vector::push_back函数来向vector中添加一个元素。
根据这些信息,我们可以初步判断程序可能存在内存分配错误或越界访问等问题,需要进一步查看代码来进行排查。
分析以下valgrind 信息 ==32456== 24 bytes in 1 blocks are definitely lost in loss record 68 of 294 ==32456== at 0x4C2A7E6: operator new(unsigned long, std::nothrow_t const&) (vg_replace_malloc.c:385) ==32456== by 0x69DAF1D: __cxa_thread_atexit (in /usr/lib64/libstdc++.so.6.0.19) ==32456== by 0x5BB2518: rocksdb::InstrumentedMutex::Lock() (in /usr/lib64/librocksdb.so.6.20.3) ==32456== by 0x5A66C97: rocksdb::DBImpl::BackgroundCallCompaction(rocksdb::DBImpl::PrepickedCompaction*, rocksdb::Env::Priority) (in /usr/lib64/librocksdb.so.6.20.3) ==32456== by 0x5A672C9: rocksdb::DBImpl::BGWorkCompaction(void*) (in /usr/lib64/librocksdb.so.6.20.3) ==32456== by 0x5C97FB5: rocksdb::ThreadPoolImpl::Impl::BGThread(unsigned long) (in /usr/lib64/librocksdb.so.6.20.3) ==32456== by 0x5C981C5: rocksdb::ThreadPoolImpl::Impl::BGThreadWrapper(void*) (in /usr/lib64/librocksdb.so.6.20.3) ==32456== by 0x6A3332F: ??? (in /usr/lib64/libstdc++.so.6.0.19) ==32456== by 0x5046EA4: start_thread (in /usr/lib64/libpthread-2.17.so) ==32456== by 0x729CB0C: clone (in /usr/lib64/libc-2.17.so)
根据Valgrind提供的信息,可以得出以下分析:
这段Valgrind信息表示在程序运行结束时,有24字节的内存块是明确丢失的。这是在294条记录中的第68条记录。
这个内存块的分配是通过`operator new`函数进行的,具体是在`vg_replace_malloc.c`文件的`operator new(unsigned long, std::nothrow_t const&)`函数中进行的。这个函数用于分配内存,并且使用了`std::nothrow_t`参数,表示在分配失败时不抛出异常。
这个内存块的丢失发生在`libstdc++.so.6.0.19`库文件中的`__cxa_thread_atexit`函数中。这个函数是C++标准库中的一个线程退出钩子函数,用于在线程退出时执行清理操作。
进一步跟踪,这个内存块的丢失是在`librocksdb.so.6.20.3`库文件中的`rocksdb::InstrumentedMutex::Lock()`函数中发生的。这个函数是RocksDB数据库引擎的一个锁操作函数,用于获取互斥锁。
在调用堆栈中,可以看到这个内存块丢失是在RocksDB数据库引擎的后台合并线程(Background Compaction)中发生的。具体是在`rocksdb::DBImpl::BackgroundCallCompaction()`和`rocksdb::DBImpl::BGWorkCompaction()`函数中进行的合并操作。
最后,从调用堆栈中可以看到,这个内存块的丢失是在后台线程中发生的。这是在`librocksdb.so.6.20.3`库文件中的`rocksdb::ThreadPoolImpl::Impl::BGThread()`和`rocksdb::ThreadPoolImpl::Impl::BGThreadWrapper()`函数中执行的。
综上所述,根据Valgrind的信息分析,这段代码中存在一个明确的内存泄漏问题,24字节的内存块在后台合并线程中丢失。需要进一步检查代码,确保在合适的时机释放这些内存块,以避免资源泄漏和潜在的问题。
阅读全文