Pregunta

Lo siento, no puede ser específico con código, pero los problemas que estoy viendo son anómalas. los valores de cadena de caracteres parecen ser cada vez cambiado dependiendo de otros códigos, no relacionado. Por ejemplo, el valor del argumento que se pasa en torno a continuación cambiará dependiendo de si simplemente comento hacia fuera uno o dos de los fprintf () llamadas! Por último fprintf () el valor está normalmente vacía por completo (y no, no he revisado para asegurarse de que no estoy modificando directamente el argumento ... todo lo que tengo que hacer es comentar una fprintf () o añadir otra fprintf () y el valor de la cadena va a cambiar en ciertos puntos):

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

Hay más de código por todas partes, así que no puedo pedir a alguien para depurar mi programa - lo que quiero saber es cómo puedo depurar qué cadenas de caracteres como éste están recibiendo su memoria cambia o se sobrescribe basado en el código no relacionado. Se limita la memoria? Mi pila demasiado pequeño? ¿Cómo le digo? ¿Qué más puedo hacer para localizar el problema? Mi programa no es enorme, es como mil líneas de código de dar o tomar y un par vinculado dinámicamente librerías externas, pero nada fuera de lo común.

ayuda! TIA!

¿Fue útil?

Solución

simple:

  1. Aprender a usar Valgrind , en concreto memcheck
  2. Aprender a usar BGF , incluyendo puntos de quiebre y variables inspección
  3. La práctica hace al maestro.

Esto debería solucionar el problema. Asegúrese de que compila las bibliotecas con la opción -g en GCC, que mantiene los símbolos de depuración para que su salida de depuración tiene más sentido.

Otros consejos

Hay dos casos a considerar:

  1. La variable arg cambia de valor entre el inicio y el final de process_args.
  2. Las estancias arg el mismo, pero la cadena que lo han generado se cambia.

Su descripción y su código no distingue entre los dos, pero es importante saber cuál de los dos está sucediendo realmente.

Esto revelará la respuesta:

fprintf(stderr, "Function arg is %s (%p)\n", arg, (void *)arg);
... do bunch of stuff ...
fprintf(stderr, "Function arg is now %s (%p)\n", arg, (void *)arg);

Lo más a menudo arg no está cambiando (es decir, usted tiene el caso 2). Si es así, algo está corrompiendo a la cadena que ha asignado. Valgrind, sugerido ya, pero sólo disponible en Linux, AIX y MacOSX, sólo tiene una probabilidad de 50:50 de encontrar el problema. Lo que realmente Want es un punto de observación BGF: punto de interrupción establecido en el inicio de process_args, una vez golpe, hacer (gdb) watch *(long*)arg y continue. GDB se detendrá cuando algo escribe a *arg (que en realidad se detendrá en la siguiente instrucción). A continuación, utilizar el comando (gdb) where de averiguar lo que está pasando.

Si usted tiene realmente arg cambiar su valor (caso 1), que puede ser más difícil de depurar, e indica daños en la pila de algún tipo, o una violación del procedimiento de convenciones de llamada para su plataforma. Valgrind probablemente no ayudará en absoluto con eso. Esto es más coherente con el comportamiento que describes:. Comentando código relacionado provoca el error de desplazamiento

No se puede dar algún consejo adicional sobre la depuración de 1 caso, sin embargo, ya que no han revelado lo que su real es la plataforma.

Si está escribiendo aplicaciones de nivel de usuario, Valgrind es una opción buena para detectar problemas de memoria, tales como pérdidas de memoria, desbordamiento del búfer, etc. Aquí está una guía de inicio rápido: http://valgrind.org/docs/manual/QuickStart.html

no dan sus herramientas dev, pero si usted es como el 90% de los codificadores que ya está utilizando un IDE con un depurador que puede manejar esto, no hay necesidad de herramientas nuevas. Establecer una vigilancia sobre el trozo de memoria que contiene las cuerdas, a continuación, paso a través de su código y ver cuando las cuerdas se cambian.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top