我目前正在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;
}
答案 0 :(得分:0)
您是否尝试过运行应用验证程序?我和mingw有同样的问题,但让应用程序验证程序修复它。它来自Microsoft's webpage.它真的很容易使用,只需启动它,选择你的.exe,它就在后台运行。