2010-04-21 46 views
10

我有一個std :: map < std :: string,std :: string>用一些API調用初始化。當我嘗試使用此地圖時,我遇到了分段錯誤。我如何檢測無效的代碼或什麼是無效的或任何可以幫助我解決問題的細節?代碼如下所示:如何使用Valgrind檢測分段故障細節?

std::map< std::string, std::string> cont; 

some_func(cont); // getting parameter by reference and initialize it, someone corrupted memory (cont) inside this function 

std::cout << cont[ "some_key" ] << '\n'; // segmentation fault here, cannot access "some_key" 
+0

'cont'不會恰好是一個全球性的,你在一些全局對象的構造函數訪問不是嗎? – 2010-04-23 20:58:07

+0

@Davit:順便說一句,你可能想要不時地接受答案。讓每個人都知道哪個答案解決了您的問題是SO社區的一個重要方面。 – 2010-04-23 20:59:18

+0

好的,我會再寫一次關於修復 – 2010-04-26 07:35:00

回答

3

一般我不知道那怎麼行可以生成一個賽格故障:括號運算符將始終返回的std :: string(如果需要創建一個空的),它應該永遠是有效的打印。

有沒有可能是相反,你看到調用堆棧是指向下一行來執行和它的死在some_func?我們沒有看到它的代碼,所以我不能說它是否會導致問題。

或者是some_func使用char *(將調用臨時的std :: string)來初始化字符串的地圖?有可能它會在地圖上引入一個無效的字符串,這個字符串「正常工作」了一段時間,但是當some_func返回時它不會很好地與打印機交互。

2

你的語法啓動應用程序(在調試模式下進行編譯):

valgrind yourapp 

Valgrind的會告訴你在哪裏分割故障發生的棧回溯。之後,由你來找到發生的事情並糾正它。

在你的代碼中,無論valgrind如何,我都會檢查返回cont[ "some_key" ]是什麼導致segfault最可能的原因是返回的值是一些野指針或根本沒有初始化。如果是這樣,任何嘗試訪問它像cont["some_key"][0]也會導致分段錯誤。

另一個想法:對地圖中的字符串鍵是什麼?是否有可能他們中的一些人(沒有例外)無法分配用作鍵的字符串的數據部分。 std :: map不是一個哈希表,而只是一些有序的容器。當搜索一個密鑰時,它可能需要訪問其他密鑰,並且可能會在那裏發生。檢查是否可以嘗試遍歷地圖中的所有鍵並顯示內容(以查看「some_key」特定發生的問題,還是可以在地圖中無法訪問任何東西)

如果您的地圖中包含您的地圖,您也可以嘗試使用unordered_map程序並不需要訂貨,看的行爲是一樣的。

+0

的代碼,我更新了它,添加了新的評論,這些評論必須描述問題 – 2010-04-21 15:37:36

0

除了Valgrind的,你可以嘗試以使用調試器專注於您的問題。

設置一個斷點在some_func(cont)線,並檢查如果cont爲有效參考。

此外,有如果some_key不存在,你考慮cont["some_key"]返回什麼?