2010-01-07 40 views
0

我有一個插件系統在我的項目(在Linux上運行),而這部分是插件有一個「跑」的方法,如:在C++中調試參數損壞?

​​

我打電話給我的插件,去檢查我的argv數組(在做了一堆其他的東西之後),並且 數組已損壞。我可以在函數的頂部打印出數值,它們是正確的,但不會在執行過程中。很顯然,有些東西正在破壞堆,但是我不知道如何確定什麼是覆蓋內存。 Valgrind並沒有幫助我很多。

示例代碼的請求:

我的插件看起來是這樣的:

void test_fileio::run(int argc, char* argv[]) { 
    bool all_passed = true; 

    // Prints out correctly. 
    for (int ii=0; ii < argc; ii++) { 
    printf("Arg[%i]: %s\n", ii, argv[ii]); 
    } 

    <bunch of tests snipped for brevity> 

    // Prints out inccorrectly. 
    for (int ii=0; ii < argc; ii++) { 
    printf("Arg[%i]: %s\n", ii, argv[ii]); 
    } 
} 

這是鏈接到它公開到Python這樣我就可以把這些插件,蟒蛇功能的系統。所以我有一個字符串參數,以我的Python功能,打破了這一點正是如此:那麼

char** translate_arguments(string args, int& argc) { 
    int counter = 0; 
    vector<char*> str_vec; 

    // Copy argument string to get rid of const modifier 
    char arg_str[MAX_ARG_LEN]; 
    strcpy(arg_str, args.c_str()); 

    // Tokenize the string, splitting on spaces 
    char* token = strtok(arg_str, " "); 
    while (token) { 
    counter++; 
    str_vec.push_back(token); 
    token = strtok(NULL, " "); 
    } 

    // Allocate array 
    char** to_return = new char*[counter]; 
    for (int ii=0; ii < counter; ii++) 
    to_return[ii] = str_vec[ii]; 

    // Save arg count and return 
    argc = counter; 
    return to_return; 
} 

產生的argc和argv傳遞到上面提到的插件。

+0

可以包含代碼的樣本,使其更容易爲我們的同胞,以便用戶瞭解你在做什麼? – t0mm13b 2010-01-07 01:21:23

+0

添加了示例代碼,因爲這個插件非常大,所以它是骨架的,但是這會給你提供問題所在的要點。 – 2010-01-07 01:25:24

+0

我想我們可以告訴問題的本質是什麼,但是您已經排除了任何有助於解決問題實際來源的問題。有一百萬種不同的東西可能會破壞這個數組,但你遺漏了所有的代碼。 – SoapBox 2010-01-07 01:34:19

回答

2

translate_arguments如何被調用?缺失...

在調用插件中的run函數之前是否準備了指向字符的指針數組,因爲run函數的參數爲​​char *argv[]

這看起來像在作祟......通過代碼判斷

 
// Allocate array 
char** to_return = new char*[counter]; 

你打算分配指針指向字符,雙指針線,但它看起來的優先級代碼有點混淆了? 您是否嘗試過這種方式:

 
char** to_return = new (char *)[counter]; 

此外,在for循環如圖所示......你不分配包含在載體中的字符串本身空間......?

 
for (int ii=0; ii < counter; ii++) 
    to_return[ii] = str_vec[ii]; 

// Should it be this way...??? 

for (int ii=0; ii < counter; ii++) 
    to_return[ii] = strdup(str_vec[ii]); 

在乘車路線downvoted作爲OP沒有表現出translate_arguments怎麼叫,缺乏進一步的信息風險....和誤判,如果我的回答是不正確......

希望這有助於 最好的問候, 湯姆。

+0

我同意你的第二部分(爲字符串分配存儲空間)。按照目前的寫法,向量中的指針指向存儲在棧上的數據,然後超出範圍(arg_str)。在調用translate_arguments之後,可能有一些代碼會覆蓋堆棧中的空間(局部變量等)。 – Luke 2010-01-07 01:56:16

+0

果然,似乎已經解決了這個問題,謝謝! – 2010-01-07 15:55:35

2

查找如何在調試器中使用內存訪問斷點。如果你有一個可靠的回購,這將在幾秒鐘內找出你的問題。在WinDbg中,它是:

ba w4 0x<address> 

其中BA代表「對獲得突破」,「W4」是「寫4個字節」(64位系統上使用W8)和「地址」顯然你的地址」重新看到損壞。 gdb和Visual Studio具有類似的功能。

+0

任何想法你怎麼可以用gdb做到這一點?聽起來像我所需要的。 – 2010-01-07 01:26:20

+0

看起來像http://stackoverflow.com/questions/58851/can-i-set-a-breakpoint-on-memory-access-in-gdb – 2010-01-07 01:27:32

+0

非常好,謝謝! – 2010-01-07 01:28:22

0

如果Valgrind的和代碼檢查不幫助你可以嘗試電子圍欄