Cygwin使GDB无用
我目前正在Windows上运行Cygwin,以便使用GCC并避免使用Visual Studio和MinGW GCC工作得很好,但是GDB做得并不好。GDB无法检测分段错误-您可以看到这将是一个巨大的问题。当运行gcc生成的带有问题代码的默认a.exe文件时,终端输出“分段故障(堆芯转储)”。很好,很好。然而,当在gdb下运行这个gcc-g(可能还有-O0)编译程序时,这是我的输出Cygwin使GDB无用,gdb,cygwin,Gdb,Cygwin,我目前正在Windows上运行Cygwin,以便使用GCC并避免使用Visual Studio和MinGW GCC工作得很好,但是GDB做得并不好。GDB无法检测分段错误-您可以看到这将是一个巨大的问题。当运行gcc生成的带有问题代码的默认a.exe文件时,终端输出“分段故障(堆芯转储)”。很好,很好。然而,当在gdb下运行这个gcc-g(可能还有-O0)编译程序时,这是我的输出 Starting program: /home/Beo/a.exe [New Thread 25968.0x650
Starting program: /home/Beo/a.exe
[New Thread 25968.0x6500]
[New Thread 25968.0x64fc]
[Inferior 1 (process 25968) exited normally]
它应该在这里检测到分段错误。当我运行-backtrace程序时(因为gdb中没有堆栈,所以我以后无法回溯),它确实显示了一个分段错误,但没有给出发生在哪里的信息。输出如下:
Starting program: /home/Beo/a.exe -backtrace
[New Thread 25696.0x1208]
[New Thread 25696.0x6570]
Program received signal SIGSEGV, Segmentation fault.
0x5c636972 in ?? ()
我不知道它为什么这么做,有什么想法吗?
(我试过增加cygwin的内存限制,但没有解决任何问题。)
(我还应该指出,这并不是这个程序特有的,gdb在我的Linux机器上可以很好地检测到错误)
测试代码:
/*Heaps*/
#include <stdio.h>
#define LEFT(i) ((2*(i)) + 1)
#define RIGHT(i) ((2*(i)) + 2)
#define PARENT(i) ((i)/2)
void buildheap(int heap[], int heapsize);
void max_heapify(int heap[], int heapsize, int index);
void swap(int *, int *);
int main(){
int testheap[] = {0, 3, 8, 4, 2, 1, 99, 33, 3, 1, 2, 9};
int size = sizeof(testheap) / sizeof(testheap[0]);
buildheap(testheap, size);
/*int i;
for(i = 0; i < size; i++)
printf("[%d]", testheap[i]);
putchar('\n'); */
return 0;
}
void swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
return;
}
void max_heapify(int heap[], int heapsize, int index){
int l = LEFT(index);
int r = RIGHT(index);
int largest = index;
if(/*l < heapsize &&*/ heap[l] > heap[largest])
largest = l;
if(/*r < heapsize && */heap[r] > heap[largest])
largest = r;
if(largest != index){
swap(&heap[largest], &heap[index]);
max_heapify(heap, heapsize, largest);
}
return;
}
void buildheap(int heap[], int heapsize){
int i = heapsize/2 - 1;
for(; i >= 0; i--)
max_heapify(heap, heapsize, i);
return;
}
/*堆*/
#包括
#定义左(i)((2*(i))+1)
#定义权利(i)((2*(i))+2)
#定义父项(i)((i)/2)
void buildheap(int heap[],int heapsize);
void max_heapify(int heap[],int heapsize,int index);
无效掉期(整数*,整数*);
int main(){
int testheap[]={0,3,8,4,2,1,99,33,3,1,2,9};
int size=sizeof(testheap)/sizeof(testheap[0]);
buildheap(testheap,size);
/*int i;
对于(i=0;iheap[maximust])
最大=l;
if(/*rheap[maxist])
最大=r;
如果(最大!=索引){
交换(&heap[最大],&heap[索引]);
max_heapify(堆、堆化、最大);
}
返回;
}
void buildheap(int heap[],int heapsize){
int i=治疗/2-1;
对于(;i>=0;i--)
max_heapify(heap,heapsize,i);
返回;
}
您是否尝试过运行应用程序验证程序?我在mingw中也遇到了同样的问题,但是让应用程序验证程序来修复它。这是从它的真正易于使用,只要启动它,选择你的.exe,它在后台运行 可能的堆栈损坏(因此gdb无法生成回溯)。尝试在某些点添加断点…我尝试添加断点。至少在GDB中工作,但是GDB仍然没有检测到分段错误。请您在问题中添加一个简单的C++程序,什么地方导致GDB忽略或无法检测到的分段错误?我在问题中添加了一些代码。这就是我遇到这个问题时试图调试的东西。当max_heapify方法被递归调用多次时,就会出现问题。我已经修复了错误,但出于演示目的,我保留了它。也谢谢你指出明博士,如果我们不能解决GDB的问题,我会用它。