質問
私は私のプロジェクト(Linux上で実行されている)にプラグインシステムを持っており、この部分は、プラグインのような「実行」メソッドを持っているということです。
void run(int argc, char* argv[]);
私は自分のプラグインを呼び出して、(他のものの束をやった後)私の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にそれを公開するシステムにリンクされています。だから、私はPythonの関数に文字列パラメータを取り、thuslyそれを抜け出すます:
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は、次いで、上記のプラグインに渡されます。
解決
どのように呼び出される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]);
translate_arguments
が呼び出さと....さらに詳しい情報を欠いていると誤って判断される方法を示していなかったOPとしてdownvoted取得のリスクが私の答えが間違っている場合...
これが、お役に立てば幸い 宜しくお願いします、 トムます。
他のヒント
あなたのデバッガでメモリアクセスブレークポイントを使用する方法をルックアップ。あなたが固体のレポを持っている場合、これは数秒であなたの問題を特定します。 windbgのでは、それはです。
ba w4 0x<address>
BAは、「アクセスでブレーク」の略で、、「W4は、」(64ビットシステム上で利用W8)「4バイトの書き込み」と「アドレス」は、明らかにあなたが破損して見ているアドレスです。 GDBとVisual Studioには、同様の機能を持っています。
valgrindの、コード検査を使用すると、電気柵を試みることができる助けるいけない場合