我目前在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;
}
可能的堆棧損壞(所以gdb不能產生回溯)。嘗試在某些點添加斷點... – dbrank0
我嘗試添加斷點。至少在gdb中這些工作,但gdb仍然沒有檢測到分段錯誤。 – user3391163
請問您可以給您的問題添加一個簡單的C++程序是什麼導致gdb忽略或無法檢測到的分段錯誤? –