2014-10-03 75 views
1

我的應用程序運行在系統中的罰款,但在系統B段錯誤指針顯示爲(空)

系統A(Hyper-V的虛擬機)

  • Linux的System_A 2.6.32-5-686 #1 SMP星期二5月13日16點33分32秒UTC 2014的i686的GNU/Linux
  • gcc版本4.4.5(Debian的4.4.5-8)
  • 文件系統:EXT3

體系B(覆盆子裨)

  • Linux的System_B 3.12.28+#712 PREEMPT星期二09月16日15時49分十三秒BST 2014 armv6l的GNU/Linux
  • gcc版本4.6.3(Debian的4.6.3-14 + rpi1)
  • 文件系統:嘗試使用ext3和ext4

該應用程序的目的是跟蹤使用inotify目錄中所做的更改。它將元數據保存到一個(如果它不存在,將被創建)日誌文件。但是,在系統B上它甚至沒有那麼遠。

當我運行程序來監視對目錄的更改時,它會在嘗試計算出正在修改哪個文件時崩潰。

我已經做了一些挖掘,似乎沒有正確設置一個文件名指針(我用作臨時文件名持有者,而我計算出該文件是否感興趣)。

變量使用

char *filename; 

初始設置,我不使用變量以任何其他方式,直到我正在修改一個文件名填充它。

當我隨後事件的文件名(正在修改該文件)複製到一個臨時變量它出現segfaults:

strcpy(filename,event->name); 

現在,當我加入一些

printf("ignoring %s \n", event->name); 
printf("filename = %s \n", filename); 

..before的strcpy所以我可以看到發生了什麼我看到:

對系統A

ignoring .testfile.swp 
filename = Hd¤¿Xè|·ðc¤¿ÿÿÿÿô¿~·® 

在系統B

ignoring .testfile.swp 
filename = (null) 
Segmentation fault 

我可以在這個階段看到的唯一區別是變量名「」也許是沒有正確initialzed。但也許這沒有關係,也許我看錯了方向。

問題:

  • ,我需要我用strcpy還是應該這只是工作之前,「準備」的指針?

  • 是否在兩個gcc版本之間存在限制?我只是編譯與gcc worklog.c -o worklog

  • 是否有可能獲得更多的信息時調試輸出的方式,當segfault發生?

+1

您需要用分配內存' malloc()'並設置'filename'指向它。否則,'strcpy()'應該複製到哪裏? – Barmar 2014-10-03 04:33:55

+0

'char * filename;'不分配任何存儲; 'strcpy(filename,...)'將數據複製到隨機指針上,或者如果幸運的話可能是空指針。未定義的行爲 - 不好,不惜一切代價避免。 – 2014-10-03 04:34:26

+0

謝謝,我會試試這個。任何想法爲什麼它不會在System_A上破壞?也許不正確,但我一直在使用它像這樣沒有問題多年.. – captcha 2014-10-03 04:35:34

回答

2

之前,你可以複製到filename,您需要分配空間:

filename = malloc(strlen(event->name)+1); // +1 for the null terminator 
strcpy(filename, event->name); 
+0

雖然這兩個答案都解決了我的具體問題,但我已經接受了這個答案,因爲它稍微短一點,也更易於解釋。 – captcha 2014-10-07 02:11:44

1

您需要首先分配緩衝空間,如下所示:

filename = (char *) malloc(sizeof(char)*(strlen(event->name)+1)); 
strcpy(filename,event->name); 
+0

感謝您的超快答案,它絕對解決了我的特殊問題。 – captcha 2014-10-07 02:13:41