0

私は自分のプロジェクト (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関数に文字列パラメータを取り、それを次のように分割します:

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 は、上記のプラグインに渡されます。

4

3 に答える 3

2

どのようtranslate_argumentsに呼び出されますか? それが欠けている...

関数にはパラメーターがrunあるため、プラグインで関数を呼び出す前に、chars へのポインターの配列を準備しますか?runchar *argv[]

これは、問題を引き起こしている行のように見えます...コードから判断すると

// 配列を割り当てます
char** to_return = new char*[カウンター];

chars へのポインターへのポインター、つまり double ポインターを割り当てようとしていますが、コードの優先順位が少し混乱しているように見えますか? この方法で試しましたか:

char** to_return = new (char *)[カウンター];

また、示されているようにforループで...ベクトルに含まれる文字列自体にスペースを割り当てていません...?

for (int ii=0; ii < カウンター; ii++)
    to_return[ii] = str_vec[ii];

// このままでいいのか…???

for (int ii=0; ii < カウンター; ii++)
    to_return[ii] = strdup(str_vec[ii]);

OPが呼び出された方法を示しておらず、translate_arguments詳細な情報が不足しているため、反対票を投じるリスクがあります....そして、私の答えが間違っているかどうかを誤解しています...

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-01-07T01:36:16.110 に答える
2

デバッガーでメモリ アクセス ブレークポイントを使用する方法を参照してください。しっかりしたレポがある場合は、問題を数秒で特定できます。Windbg では、次のようになります。

ba w4 0x<address>

ba は「アクセス時にブレーク」を表し、「w4」は「4 バイトを書き込む」(64 ビット システムでは w8 を使用)、「アドレス」は明らかに破損しているアドレスです。gdb と Visual Studio には同様の機能があります。

于 2010-01-07T01:25:45.443 に答える
0

valgrind とコード インスペクションが役に立たない場合は、電気柵を試すことができます

于 2010-01-07T01:40:14.200 に答える