如何调试异常C内存/堆栈问题

EBM*_*EBM 0 c memory stack alloc

对不起,我不能具体代码,但我看到的问题是异常的.字符串值似乎正在根据其他不相关的代码进行更改.例如,下面传递的参数值只会根据我是否注释掉一个或两个fprintf()调用而改变!通过最后一个fprintf(),该值通常是完全空的(不,我已经检查以确保我没有直接修改参数...我所要做的就是注释掉fprintf()或添加另一个fprintf()并且字符串的值将在某些点发生变化!):

static process_args(char *arg) {
    /* debug */
    fprintf(stderr, "Function arg is %s\n", arg);

    ...do a bunch of stuff including call another function that uses alloc()...

    /* debug */
    fprintf(stderr, "Function arg is now %s\n", arg);    
}

int main(int argc, char *argv[]) {
    char *my_arg;

    ... do a bunch of stuff ...

    /* just to show you it's nothing to do with the argv array */
    my_string = strdup(argv[1]);

    /* debug */
    fprintf(stderr, "Argument 1 is %s\n", my_string);

    process_args(my_string);
}
Run Code Online (Sandbox Code Playgroud)

周围有更多的代码,所以我不能要求有人调试我的程序 - 我想知道的是我如何调试为什么这样的字符串会根据不相关的代码更改或覆盖内存.我的记忆有限吗?我的堆栈太小了?我怎么说?我还能做些什么来追查这个问题?我的程序并不大,就像一千行代码给出或接受一对动态链接的外部库,但没有什么不寻常的.

救命!TIA!

Aid*_*ell 6

简单:

  1. 学习使用Valgrind,特别是memcheck
  2. 学习使用GDB,包括断点和变量检查
  3. 实践是完美的.

那应该排序.确保使用-gGCC 上的选项编译任何库,这样可以保持调试符号,从而使调试输出更有意义.