문제

내 프로젝트에 플러그인 시스템 (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 기능으로 호출 할 수 있습니다. 그래서 나는 문자열 매개 변수를 파이썬 함수로 가져 와서 다음과 같이 나눕니다.

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];

이중 포인터 인 Chars에 대한 포인터에 대한 포인터를 할당하려고하지만 코드의 우선 순위가 약간 혼합 된 것 같습니다. 이 방법으로 시도해 보셨습니까?

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

또한, 당신의 루프에서 볼 수 있듯이 ... 당신은 벡터에 포함 된 문자열 자체에 공간을 할당하지 않습니다 ...?

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]);

OP가 어떻게 translate_arguments 추가 정보가 부족하고 .... 내 대답이 잘못되면 잘못 판단 ...

이것이 도움이되기를 바랍니다.

다른 팁

디버거와 함께 메모리 액세스 중단 점을 사용하는 방법. 확실한 리포가 있으면 몇 초 만에 문제를 정확히 찾아냅니다. Windbg에서는 다음과 같습니다.

ba w4 0x<address>

BA가 "Access on Access"를 나타내는 경우, "W4"는 "Write 4 Bytes"(64 비트 시스템에서 W8 사용)이며 "주소"는 분명히 손상된 주소입니다. GDB와 Visual Studio는 비슷한 기능을 가지고 있습니다.

Valgrind 및 코드 검사가 도움이되지 않으면 전기 울타리를 시험해 볼 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top