2012-01-26 16 views
0

我想解析一個超過500字節的字符串使用json_object * jobj = json_tokener_parse(my-> src);在那裏我 - > SRC包含字符串,但我同時用gdb調試提示以下錯誤:在JSON-C庫文件中的一個:在json-c庫中的錯誤

Program received signal SIGSEGV, Segmentation fault. 
json_object_get_object (jso=0xfffffffc) at json_object.c:255 
255  json_object.c: No such file or directory. 
     in json_object.c 

誰能告訴我,什麼可能是錯誤的。

+0

json_object.c,第255行做了什麼? –

+0

my-> src'的內容究竟是什麼? –

+0

struct lh_table * json_object_get_object(struct json_object * jso) { if(!jso)return NULL; switch(jso-> o_type){case_json_type_object: return jso-> o.c_object; 默認值: 返回NULL; } } – user537670

回答

1

段故障指示管理不善的存儲器中,例如一個雙free,或在您的情況下的未終止的字符串,緩衝區溢出,或在JSON-C只是一個存儲器管理錯誤。值得注意的是,內存損壞可能發生在分段錯誤之前,並且在解碼JSON輸入時可能只是(僞)隨機出現。

我強烈建議在調試器(如gdb)和/或內存訪問檢查程序(如valgrind)下運行程序,該程序將在分段故障發現之前找到內存管理錯誤。

+0

+1表示「在分段錯誤之前可能發生」。問題可能不在圖書館(儘管有時可能是)。 –

+0

@ChrisLutz:但是當大小小於500字節時,它沒有問題。 – user537670

+0

@ user537670你可以上傳演示文件(JSON +簡體C代碼)到[pastebin.com](http://pastebin.com)左右嗎?沒有代碼或輸入,我們可以猜測並給出一般提示。 – phihag

2

你想測試:

if (is_error(jso)) { 
    // handle error here 
} 

在做任何事情之前。無論出於何種原因,庫返回一個假指針而不是null,並且沒有真正記錄這個(is_error在json/bits.h中定義)。

0

嘗試使用json_tokener_parse_verbose()而不是json_tokener_parse()。

這對我很有用,因爲json_tokener_parse_verbose()返回一個空指針,然後它被is_error()拾取。