문제
내 프로젝트에 플러그인 시스템 (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 및 코드 검사가 도움이되지 않으면 전기 울타리를 시험해 볼 수 있습니다.