Cygwin使GDB无用

时间:2014-03-07 05:20:27

标签: gdb cygwin

我目前正在Windows上运行Cygwin以使用GCC并避免使用Visual Studio和MinGW。

GCC运作良好,但GDB表现不佳。 GDB无法检测到分段错误 - 您可以看到这将是一个巨大的问题。当运行由gcc生成的带有问题代码的默认a.exe文件时,终端输出“Segmentation fault(core dumped)”。那很好,很棒。但是当在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; 
}

1 个答案:

答案 0 :(得分:0)

您是否尝试过运行应用验证程序?我和mingw有同样的问题,但让应用程序验证程序修复它。它来自Microsoft's webpage.它真的很容易使用,只需启动它,选择你的.exe,它就在后台运行。