Cygwin使GDB无用

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

我目前正在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.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的问题,我会用它。