【问题标题】:Crashes when trying to generate multiples of the same process(Access Violation Error)尝试生成多个相同进程时崩溃(访问冲突错误)
【发布时间】:2020-02-24 14:28:28
【问题描述】:

因此,当我尝试创建同一程序的多个进程时,我在尝试创建第二个子进程时遇到访问冲突错误。 (我可以在尝试创建第二个子进程崩溃之前创建一个子进程)

int main(int argc, char** argv)
{
    if (argc > 1 && strcmp(argv[1], "lol")) ThreadFunc();

    char key_code;
    int i = 0;

    STARTUPINFO* si = calloc(1, sizeof(STARTUPINFO));
    PROCESS_INFORMATION* pi = calloc(1, sizeof(PROCESS_INFORMATION));

    WCHAR** wideArguments = calloc(1, sizeof(wchar_t*));
    size_t outSize;
    size_t size = strlen(arguments) + 1;

    while (1) {
        if (_kbhit()) {
            key_code = _getch();
            if (key_code == 'c') {
                i += 10;
                si = realloc(si, i * sizeof(STARTUPINFO));
                pi = realloc(pi, i * sizeof(PROCESS_INFORMATION));
                wideArguments = realloc(wideArguments, i * sizeof(wchar_t*));
                for (int k = 0; k < 10; k++) {
                    wideArguments[i + k - 10] = calloc(256, sizeof(wchar_t));
                    GetModuleFileName(NULL, wideArguments[i + k - 10], 256);
                    wcscat_s(wideArguments[i + k - 10], 256, L" lol");
                    int l = CreateProcess(NULL, wideArguments[i + k - 10], NULL, NULL, FALSE, 0, NULL, NULL, &si[i + k - 10], &pi[i + k - 10]);
                    if (l == 0) printf("\n\n%d\n\n", GetLastError());
                }
            }
            else if (key_code == 'x') {
                free(si);
                free(pi);
                for(int j = 0; j < i;j++) free(wideArguments[j];
                free(wideArguments);
                exit(0);        
            }
        }
        else continue;
    }
}

【问题讨论】:

  • 请注意,realloc 不会像 calloc 那样将内存归零。
  • GetModuleFileNamewscat_s 的缓冲区可能太小。检查返回值。
  • 错字:for(int j = 0; j &lt; i;i++) 应该是j++
  • @PaulOgilvie 也不算小,因为1进程创建成功,在尝试运行CreateProcess行一秒就崩溃了
  • si[i + k - 10] 在对CreateProcess 的调用中未初始化!请参阅文档。

标签: c string windows process widechar


【解决方案1】:

好的,问题是realloc 没有将内存归零,因此 pi 和 si 中的条目没有被初始化。为了解决这个问题,我们定义了一个piOriginalsiOriginal,我们稍后会使用它们来初始化数组中的条目。

STARTUPINFO siOriginal = { 0 };
PROCESS_INFORMATION piOriginal = { 0 };

将'c'输入后的循环更改为:

if (key_code == 'c') {
                i += 10;
                si = realloc(si, i * sizeof(STARTUPINFO));
                pi = realloc(pi, i * sizeof(PROCESS_INFORMATION));
                wideArguments = realloc(wideArguments, i * sizeof(wchar_t*));
                for (int k = 0; k < 10; k++) {
                    wideArguments[i + k - 10] = calloc(256, sizeof(wchar_t));
                    si[k + i - 10] = siOriginal;
                    pi[k + i - 10] = piOriginal;
                    GetModuleFileName(NULL, wideArguments[i + k - 10], 256);
                    wcscat_s(wideArguments[i + k - 10], 256, L" lol");
                    int l = CreateProcess(NULL, wideArguments[i + k - 10], NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si[i + k - 10], &pi[i + k - 10]);
                    if (l == 0) printf("\n%d\n", GetLastError());
                }
            }

【讨论】:

    猜你喜欢
    • 2016-07-12
    • 2018-02-09
    • 1970-01-01
    • 2011-04-29
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    相关资源
    最近更新 更多