2012-06-04 3 views
0

나는 C를 배우는 방법으로 gtk + 2.0 및 gtksourceview 2.0에서 텍스트 편집기를 작성하고 있습니다. 파일을 열려고하면 segfault가 나타납니다. sshfs에. 이것은 항상 문제가있는 것은 아니므로, sshfs와 관련이 있는지 여부는 알 수 없습니다.gtk_file_chooser_dialog_new()에서 g_slice_alloc() 세그먼트 화 오류

#define NUM_TABS 100 
int notebookPages[NUM_TABS]; 

경로 글로벌 숯이다

notebookPages 정수 글로벌 배열

printf("\nentered open_activated\n"); 

    GtkSourceLanguage *lang; 
    GtkSourceLanguageManager *lm; 
    GtkWidget *dialog; 
    GtkWidget *tablabel; 
    GtkTextBuffer *tbuffer; 
    int openTabs = 0; 
    const gchar *folder; 
    int page = 0; 
    char *path,*string; 

    page = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)); 
    path = paths[notebookPages[page]]; 
    folder = folderFromPath(path); 
    printf("folder: %s\n\n",folder); 

    dialog = gtk_file_chooser_dialog_new("Open File", parent, GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_OPEN,GTK_RESPONSE_ACCEPT,NULL); 
    gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(dialog), folder); 

추가 정보 : 여기

내 오픈 함수에서 코드 블록이며 배열 :

char paths[NUM_TABS][200]; 
내가 정말 잘 이해할 필요가 있음을 알고 어디 내 학습의 해당 위치에있어

#0 0xb6e1d257 in g_slice_alloc() from /usr/lib/libglib-2.0.so.0 
#1 0xb6e1e42e in g_slist_prepend() from /usr/lib/libglib-2.0.so.0 
#2 0xb6e27c74 in g_once_init_enter_impl() from /usr/lib/libglib-2.0.so.0 
#3 0xb739e24e in gtk_dialog_get_type() from /usr/lib/libgtk-x11-2.0.so.0 
#4 0xb73d1527 in gtk_file_chooser_dialog_get_type() from /usr/lib/libgtk-x11-2.0.so.0 
#5 0xb73d15d6 in ??() from /usr/lib/libgtk-x11-2.0.so.0 
#6 0xb73d1735 in gtk_file_chooser_dialog_new() from /usr/lib/libgtk-x11-2.0.so.0 
#7 0x08050506 in open_activated (widget=0x8266878, parent=0x8083a60) at ledit.c:1715 
#8 0xb6eea3dc in g_cclosure_marshal_VOID__VOID() from /usr/lib/libgobject-2.0.so.0 
#9 0xb6ee8f5a in g_closure_invoke() from /usr/lib/libgobject-2.0.so.0 
#10 0xb6efc816 in ??() from /usr/lib/libgobject-2.0.so.0 
#11 0xb6f05168 in g_signal_emit_valist() from /usr/lib/libgobject-2.0.so.0 
#12 0xb6f05302 in g_signal_emit() from /usr/lib/libgobject-2.0.so.0 
#13 0xb755a3af in ??() from /usr/lib/libgtk-x11-2.0.so.0 
#14 0xb6ee8f5a in g_closure_invoke() from /usr/lib/libgobject-2.0.so.0 
#15 0xb6efc816 in ??() from /usr/lib/libgobject-2.0.so.0 
#16 0xb6f04f13 in g_signal_emit_valist() from /usr/lib/libgobject-2.0.so.0 
#17 0xb6f05302 in g_signal_emit() from /usr/lib/libgobject-2.0.so.0 
#18 0xb734aaa1 in gtk_accel_group_activate() from /usr/lib/libgtk-x11-2.0.so.0 
#19 0xb734bf22 in gtk_accel_groups_activate() from /usr/lib/libgtk-x11-2.0.so.0 
#20 0xb7575e7d in gtk_window_activate_key() from /usr/lib/libgtk-x11-2.0.so.0 
#21 0xb7575eec in ??() from /usr/lib/libgtk-x11-2.0.so.0 
#22 0xb7427b44 in ??() from /usr/lib/libgtk-x11-2.0.so.0 
#23 0xb6ee7a37 in ??() from /usr/lib/libgobject-2.0.so.0 
#24 0xb6ee8f5a in g_closure_invoke() from /usr/lib/libgobject-2.0.so.0 
#25 0xb6efc62c in ??() from /usr/lib/libgobject-2.0.so.0 
#26 0xb6f04f13 in g_signal_emit_valist() from /usr/lib/libgobject-2.0.so.0 
#27 0xb6f05302 in g_signal_emit() from /usr/lib/libgobject-2.0.so.0 
#28 0xb755bbc6 in ??() from /usr/lib/libgtk-x11-2.0.so.0 
#29 0xb7425d63 in gtk_propagate_event() from /usr/lib/libgtk-x11-2.0.so.0 
#30 0xb742608f in gtk_main_do_event() from /usr/lib/libgtk-x11-2.0.so.0 
#31 0xb72aa42a in ??() from /usr/lib/libgdk-x11-2.0.so.0 
#32 0xb6dfed42 in g_main_context_dispatch() from /usr/lib/libglib-2.0.so.0 
#33 0xb6dff508 in ??() from /usr/lib/libglib-2.0.so.0 
#34 0xb6dffabb in g_main_loop_run() from /usr/lib/libglib-2.0.so.0 
#35 0xb7424d59 in gtk_main() from /usr/lib/libgtk-x11-2.0.so.0 
#36 0x0804d636 in main (argc=1, argv=0xbfad3774) at ledit.c:492 

: 여기

char * folderFromPath(char *path) 
{ 
    printf("\nentered folderFromPath\n"); 

    char *token[80]; 
    int i = 0; 
    char str[80]; 
    strcpy(str,path); 

    printf("path: %s\n", path); 

    token[0] = strtok(str, "/"); 

    while (token[i]!= NULL) 
    { 
    i++; 
    token[i] = strtok (NULL, "/"); 
    } 

// char folder[128]; 
    char *folder; 
    folder = malloc(sizeof(path)); 

    if (folder != NULL) 
    { 
     int j = 0; 
     strcpy(folder,"/"); 
     while (j < (i-1)) 
     { 
       strcat(folder,token[j]); 
       strcat(folder,"/"); 
      j++; 
     } 

     printf("folder: %s\n", folder); 

    return folder; 
     free(folder); 
    } 
    else 
    { 
    return "/"; 
    } 
} 

은 GDB에서 역 추적입니다 : 여기

및는 함수 folderFromPath입니다 메모리 관리 및 포인터. 이 세그 폴트의 원인은 무엇입니까? 또는 더 이상 문제를 해결하는 방법에 대한 아이디어가 있습니까? 감사.

+0

전체'notebookPages' 및'paths' 변수와'folderFromPath()'함수를 확장 할 수 있습니까? 기분이 좋지만 그걸 보지 않고서는 정말로 문제의 근원인지 알기가 어렵습니다. – sarnold

+0

@sarnold, 나는 귀하가 위에 요청한 정보를 "추가 정보"의 원래 질문에 제공했습니다. 감사. – nomadicME

답변

1

이 줄은 매우 위험합니다 : strcpy (str, path);

str []의 길이보다 큰 경로 길이가 배열 경계를 덮어 쓰게되고 다른 원하지 않는 결과가 발생할 수 있습니다.

strcpy 대신 strncpy를 사용하거나 소스 문자열이 대상 문자열보다 작거나 같은지 확인하십시오.

+0

정보를 제공해 주셔서 감사합니다. 나는 strcpy()에 의해 야기 된 잠재적 인 문제를 알지 못했다. 이 프로그램에서 valgrind를 실행할 때 출력을 정렬하는 데 어려움이 있었지만 strcpy()에 대한 많은 참조를 보았습니다. 나는이 프로그램 전체에 걸쳐이 기능을 30 가지 인스턴스로 사용한다. 나는 그것이 내가 목격 한 불안정성의 많은 부분을 설명한다. 나는 또한 내가 열려고했던 길을 기억한다. 나는 돌아가서 len을 계산했다. 배열 str에 대해 할당 된 80보다 큰 91이었습니다. 다시 한번 감사드립니다. – nomadicME