我将一段单片代码拆分为动态加载的库和调用它的main()
。我没有使用除stdc ++以外的其他库,也没有任何类,只是没有成员函数的模板化结构。我没有明确分配任何内存,也没有删除或释放代码中的任何内容。我确实使用list<T>
中的擦除对象。
切换到库+主页后,我遇到间歇性崩溃。
*** glibc detected *** : free(): invalid pointer:
从回溯中看起来似乎是列表迭代器,但是名称错误的符号使得很难确定。
然而,它不会在gdb中崩溃,valgrind也不会检测到任何内存损坏或泄漏。
之前我没有构建共享库。这就是我正在使用的
g++ -fPIC -shared library_src.cpp -o libblaH.so
g++ main.cpp -lblaH
整个库都在一个源文件中,库函数包含在extern "C"
块中,以便c用户可以访问,但是现在我用g ++编译main()作为c ++代码。
现在,当我添加优化选项时,-O2
(特别是)我开始遇到崩溃。
我试过electricfence
它说无效指针没有被malloc分配。
我很欣赏有关如何捕获这个错误的建议。我的感觉是我在一个列表迭代器无效,但我不确定。我认为除了删除的条目外,它们无法失效。
答案 0 :(得分:1)
出于某种原因,这个尖叫声未经初始化给我。许多年前,当我按小时向公司收费以帮助调试崩溃时,就像这样,有一半时间,问题是未初始化的变量。
我将使用的方法是:
我假设没有涉及多个线程。当线程涉及时,更多的事情可能会出错。当我在客户现场聘用时,我总是让他们在我启动任何调试器之前先初始化所有变量。 50%的时间我可以在第1步之后回家。