2014-03-07 39 views
1

我目前在Windows上運行Cygwin以便使用GCC並避免使用Visual Studio和MinGW。Cygwin呈現GDB無用

GCC效果很好,但是GDB的表現並不好。 GDB無法檢測到分段錯誤 - 你可以看到這將是一個巨大的問題。當運行gcc生成的默認a.exe文件時,終端會輸出「Segmentation fault(核心轉儲)」。很好,很好。然而,在gdb下運行這個gcc -g(可能是-O0)編譯的程序時,這是我的輸出。

Starting program: /home/Beo/a.exe 
[New Thread 25968.0x6500] 
[New Thread 25968.0x64fc] 
[Inferior 1 (process 25968) exited normally] 

它應該在這裏檢測到分段錯誤。當我運行 - 回溯程序(因爲沒有根據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; 
} 
+0

可能的堆棧損壞(所以gdb不能產生回溯)。嘗試在某些點添加斷點... – dbrank0

+0

我嘗試添加斷點。至少在gdb中這些工作,但gdb仍然沒有檢測到分段錯誤。 – user3391163

+0

請問您可以給您的問題添加一個簡單的C++程序是什麼導致gdb忽略或無法檢測到的分段錯誤? –

回答

0

您是否嘗試過運行應用程序驗證程序?我得到了與mingw相同的問題,但應用程序驗證者修復了它。這是從Microsoft's webpage.它真的很容易使用,只需啓動它,選擇你的.exe,並在後臺運行。