仅在未通过gdb运行时程序崩溃

时间:2017-03-18 19:03:38

标签: c gdb

我之前问了一个关于这个程序的问题并且能够解决它 - 好消息是我的程序现在正在运行!坏消息是它只有在我通过gdb运行时才有效。每当我正常编译程序时它都会崩溃,但是通过gdb运行它会提供正确的输出并允许它正常退出。

我阅读了Dennis Yurichev关于调试堆栈中的这类问题的帖子或gdb中的一些内容,但我仍然是编程的新手,所以我不知道我在做什么。

以下是将gdb附加到程序的进程ID然后转储堆栈的输出:

Breakpoint 1, 0x74337480 in OutputDebugStringA () from C:\WINDOWS\SysWOW64\KernelBase.dll
(gdb) bt
#0  0x74337480 in OutputDebugStringA () from C:\WINDOWS\SysWOW64\KernelBase.dll
#1  0x77478a64 in msvcrt!_invalid_parameter () from C:\WINDOWS\SysWOW64\msvcrt.dll
#2  0x77425a20 in wctype () from C:\WINDOWS\SysWOW64\msvcrt.dll
#3  0x00010001 in ?? ()
#4  0x77493a09 in msvcrt!fscanf_s () from C:\WINDOWS\SysWOW64\msvcrt.dll
#5  0x7749399b in msvcrt!fscanf () from C:\WINDOWS\SysWOW64\msvcrt.dll
#6  0x00401d0d in main () at ZigSort.c:377

我认为这是因为输入无效或来自fscanf的东西而导致崩溃,但这没有意义......
引用的行(main()第377行)是这里的第一个fscanf:

int main(void)
{
    //initializing file pointer
    FILE * ifp;
    ifp = fopen("zigzag.txt", "r");
    int n;

    //getting number of values
    fscanf(ifp, "%d", &n); //**LINE 377 RIGHT HERE**

    //reading values into a queue
    queue_t * data = queue_create();
    int ipt;

    for(int i=0; i<n; i++)
    {
        fscanf(ifp, "%d", &ipt);
        queue_enqueue(data, ipt);
    }

    //creating a stack of queues
    run_stack_t * runstack = run_stack_create();
    queue_t * run = queue_create();

    //finding runs and pushing them onto the stack
    int runs = 0;
    int *runpoint = &runs;
    while(queue_is_empty(data) != 1)
    {
        run = extract_next_run(data);
        run_stack_push(runstack, run);
        *runpoint += 1;
        optimizestack(runstack, runpoint);
    }

    //merging queues together in sorted order
    data = run_stack_pop(runstack);
    queue_t * merger;
    runs -= 1;

    for(int i=0; i<runs; i++)
    {
        merger = run_stack_pop(runstack);
        data = merge(merger, data);
    }
    queue_destroy(merger);

    //output
    printqueue(data);

    //freeing memory
    queue_destroy(data);
    //run_stack_destroy(runstack, runpoint);
    free(runstack);
    free(runpoint);
    fclose(ifp);
}

并且读入的zigzag.txt文件位于:

10
9 8 7 6 8 4 2 3 2 1

我很乐意尝试任何其他信息或包含其他可能需要的信息,我只是不确定如何解决这个问题。
提前谢谢!

0 个答案:

没有答案