2015-03-31 61 views
-1

我有三個不同的實驗室助教看着我的代碼,他們都沒有能夠幫助我,所以我決定在這裏嘗試。除非我刪除所有與gettimeofday和任何信號量有關的代碼,否則我會得到「分段錯誤(核心轉儲)」錯誤。我用簡單的聲明將我的代碼簡化爲只有主線程,以試圖找到問題的根源。多線程初始化中的未知分段錯誤(核心轉儲)

我的代碼:

#include <pthread.h> 
#include <semaphore.h> 
#include <sys/types.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/shm.h> 
#include <sys/time.h> 

void *threadN (void *); /* thread routines */ 

pthread_t tid[1]; /* array of thread IDs */ 

int main() 
{ 
    int i,j; 
    /* here create and initialize all semaphores */ 
    int mutex = sem_create(777777, 1); 

    int MatrixA[6000][3000]; 

    for (i=0; i < 6000; i++) { 
     for (j=0; j < 3000; j++) { 
      MatrixA[i][j]=i*j; 
     } 
    } 
    int MatrixB[3000][1000]; 

    for (i=0; i < 3000; i++) { 
     for (j=0; j < 1000; j++) { 
      MatrixB[i][j]=i*j; 
     } 
    } 

    int MatrixC[6000][1000]; 
    struct timeval tim; 
    gettimeofday(&tim, NULL); 
    float t1=tim.tv_sec+(tim.tv_usec/1000000.0); 
    gettimeofday(&tim, NULL); 
    float t2=tim.tv_sec+(tim.tv_usec/1000000.0); 
    printf("%.2lf seconds elapsed\n", t2-t1); 

    sem_rm(sem_open(777777, 1)); 
    return 0; 
}​ 

我在這裏完全難住了。

+3

你可以請你解釋一下你的代碼試圖做什麼嗎?輸入特定值時預期的輸出是什麼?沒有這些信息,很難調試你的問題。 – JamesENL 2015-03-31 03:36:07

+0

在這一點上,代碼沒有做任何事情。這只是一個開始,最終會使用多線程來快速爲數組賦值,但在達到這一點之前,我需要第一部分能夠運行,而不會簡單地給出分段錯誤而沒有別的。 – user2785277 2015-03-31 03:48:16

+0

在這種情況下,您是否可以縮小您的seg故障所在的哪條線? C語言中的線程是一件非常棘手的事情。 – JamesENL 2015-03-31 03:49:47

回答

2

你吃你的堆棧。請參閱Radix sort for 10^6 array in C,來自@Joachim Pileborg的評論:

局部變量通常存儲在堆棧中,而堆棧通常僅限於一位數兆字節。在Windows上,例如,每個進程默認爲1MB,在Linux上默認爲8MB ...

我在Windows上試過你的代碼,它已經死了,只有MatrixA定義:6000 * 3000 * 4(for int) ...

所以你必須將矩陣數據移出堆棧:將矩陣定義爲靜態或在堆上分配。

1

我發現跟蹤seg故障的一個有用的東西是使用gdb。

gcc -g -o a.out -c program.c 

-g生成源代碼級調試信息

gdb a.out core 

這個啓動GDB用的a.out

(gdb) run 

這應該運行程序,並顯示該行,其中賽格故障發生。

+1

這根本不回答問題。它會適合作爲評論,但... – alk 2015-03-31 05:35:56

+0

GDB回答所有C調試問題! OP如果GDB不適合你我建議運行「man sem_open」我們可能有不同的版本,但是sem_open的第一個參數是char *,所以如果它的sem_open正在查看地址位置777777它將成爲潛在的seg故障。 – Sweetness 2015-03-31 14:45:30