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

查找如何在调试器中使用内存访问断点。如果您有可靠的回购,这将在几秒钟内查明您的问题。在windbg中,它是:

ba w4 0x<address>

其中 ba 代表“访问中断”,“w4”是“写入 4 个字节”(在 64 位系统上使用 w8),“地址”显然是您看到的已损坏地址。gdb 和 Visual Studio 具有类似的功能。

于 2010-01-07T01:25:45.443 回答
2

如何translate_arguments被调用?那不见了……

run它是否在调用插件中的函数之前准备了一个指向字符的指针数组,因为该run函数具有参数char *argv[]

这看起来像是引起麻烦的那行......从代码来看

// 分配数组
char** to_return = new char*[计数器];

您打算分配一个指向chars指针的指针,一个双指针,但是看起来代码的优先级有点混乱?你有没有试过这样:

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

此外,在您的 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 回答
0

如果 valgrind 和代码检查对您没有帮助,您可以尝试使用电围栏

于 2010-01-07T01:40:14.200 回答