我有一个多线程C程序,它在程序的特定点始终生成分段错误.当我用gdb运行它时,没有显示错误.你能想到只有在不使用调试器时才会出现故障的原因吗?不能用它来发现问题真烦人!
我的gdb回溯给出:
(gdb) backtrace
#0 0x00000000 in ?? ()
#1 0x0804a211 in init () at example1.cpp:147
#2 0x0804a6bc in main (argc=1, argv=0xbffff3d4) at example1.cpp:283
Run Code Online (Sandbox Code Playgroud)
信息量不大.Eclipse调试器至少让我看到它停在下面的第3行:
// Create a vertex array object
GLuint vao;
glGenVertexArrays( 1, &vao );
glBindVertexArray( vao );
Run Code Online (Sandbox Code Playgroud)
这是一个非常常见的块,可以在gl编程中看到,我甚至可以使用相同的块运行其他代码,没有任何问题.所以我很困惑.
从运行make构建输出:
g++ -g -DFREEGLUT_STATIC -DGLEW_STATIC -I../../include example1.cpp ../../Commo/InitShader.o -L/usr/lib/mesa -lGLEW -lglut -lGL -lX11 -lm -o example1
Run Code Online (Sandbox Code Playgroud)
包含问题的程序:
// rotating cube with two texture objects
// change textures with 1 and 2 keys
#include "Angel.h"
const int NumTriangles = 12; // …Run Code Online (Sandbox Code Playgroud) 我遇到了一些程序的问题,我搜索了有关分段错误的内容,我不太了解它们,我唯一知道的是,大概是我试图访问一些我不应该访问的内存.问题是我看到了我的代码并且不明白我做错了什么.
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define lambda 2.0
#define g 1.0
#define Lx 100
#define F0 1.0
#define Tf 10
#define h 0.1
#define e 0.00001
FILE *file;
double F[1000][1000000];
void Inicio(double D[1000][1000000]) {
int i;
for (i=399; i<600; i++) {
D[i][0]=F0;
}
}
void Iteration (double A[1000][1000000]) {
long int i,k;
for (i=1; i<1000000; i++) {
A[0][i]= A[0][i-1] + e/(h*h*h*h)*g*g*(A[2][i-1] - 4.0*A[1][i-1] + 6.0*A[0][i-1]-4.0*A[998][i-1] + A[997][i-1]) + 2.0*g*e/(h*h)*(A[1][i-1] - 2*A[0][i-1] + A[998][i-1]) + e*A[0][i-1]*(lambda-A[0][i-1]*A[0][i-1]);
A[1][i]= A[1][i-1] + e/(h*h*h*h)*g*g*(A[3][i-1] - 4.0*A[2][i-1] …Run Code Online (Sandbox Code Playgroud) 更新
[X] 我发现
TLS::credentials creds在全局范围内声明时会发生这种情况,但是如果我在外部声明它不会发生段错误。我需要它是全局的,因为它有助于缓存证书,并且多个线程可以使用其他线程创建的证书,而无需花时间创建新证书。
[X] 我进一步减少了大约 200 行的代码。到 100 行
我正在使用 Botan 创建一个 TLS 应用程序,我的应用程序在应用程序结束时因段错误而崩溃。
我试图用 Valgrind 调试它,但它无济于事。
这是来自 Valgrind 的堆栈跟踪,
==3841967== Invalid write of size 8
==3841967== at 0x4842964: memset (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==3841967== by 0x566A82F: Botan::deallocate_memory(void*, unsigned long, unsigned long) (in /usr/lib/x86_64-linux-gnu/libbotan-2.so.12.12.1)
==3841967== by 0x55E1A4D: ??? (in /usr/lib/x86_64-linux-gnu/libbotan-2.so.12.12.1)
==3841967== by 0x40EC7B: std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() (shared_ptr_base.h:155)
==3841967== by 0x40EC29: std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() (shared_ptr_base.h:730)
==3841967== by 0x41112D: std::__shared_ptr<Botan::RSA_Public_Data const, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr() (shared_ptr_base.h:1169)
==3841967== by 0x411107: std::shared_ptr<Botan::RSA_Public_Data const>::~shared_ptr() (shared_ptr.h:103)
==3841967== by 0x41109D: Botan::RSA_PublicKey::~RSA_PublicKey() (rsa.h:25) …Run Code Online (Sandbox Code Playgroud) 如何调试Python分段错误?
我们试图在SuSE 12.3上运行我们的python代码.我们得到可重现的分段错误.多年来,python代码一直在其他平台上工作而没有分段错误.
我们只编写Python代码,没有C扩展....
调试这个的最佳方法是什么?我知道有点ansi c,但那是十年前......
Python 2.7.5
更新
解析器关闭时会发生分段错误.
我可以多次运行脚本:
python -m pdb myscript.py arg1 arg1
continue
run
continue
run
Run Code Online (Sandbox Code Playgroud)
但是如果我使用ctrl-d离开pdb,则会发生分段错误.
更新2
我现在尝试用gdb调试它:
gdb
> file python
> run myscript.py arg1 arg2
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffefbe2700 (LWP 15483)]
0x00007ffff7aef93c in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
(gdb) bt
#0 0x00007ffff7aef93c in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
#1 0x00007ffff7af5303 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.7.so.1.0
#2 0x00007ffff7adc858 in ?? () from /usr/lib64/libpython2.7.so.1.0
#3 0x00007ffff7ad840d in PyObject_Call () from …Run Code Online (Sandbox Code Playgroud) 这个问题可以作为所有常见问题的参考:
当我将数据复制/扫描到未初始化指针所指向的地址时,为什么会出现神秘崩溃或"分段错误"?
例如:
char* ptr;
strcpy(ptr, "hello world"); // crash here!
Run Code Online (Sandbox Code Playgroud)
要么
char* ptr;
scanf("%s", ptr); // crash here!
Run Code Online (Sandbox Code Playgroud) 我注意到C++中的分段错误的常见原因列表没有问题,所以我想我会添加它.
自然它是社区维基,因为没有一个正确的答案.
我认为这对于学习C++的新程序员可能有用,如果你不同意,可以随意关闭它.
总线错误和分段错误之间的区别?是否会发生程序发出seg故障并第一次停止并且第二次发生总线错误并退出?
在一个已编译的程序中(假设是C或C++,但我想这个问题可以扩展到任何带有调用堆栈的非VM语言) - 通常当你溢出堆栈时,会出现分段错误:
堆栈溢出是[a]原因,分段错误就是结果.
但这总是如此吗?堆栈溢出是否会导致其他类型的程序/操作系统行为?
我也问过非Linux,非Windows操作系统和非X86硬件.(当然,如果你没有硬件内存保护或操作系统支持(例如MS-DOS)那么就没有分段错误;我问的是你可能会遇到分段错误的情况但是还会发生其他事情).
注意:假设以外的堆栈溢出,该方案是有效的,而不是试图访问数组超出边界,取消引用无效指针等