Необходимо рассмотреть два случая:
- Переменная
arg
изменяет значение между началом и концом process_args
. arg
остается тем же,но строка, на которую он указывает, изменена.
Ваше описание и ваш код не различают эти два, но важно знать, какое из двух на самом деле происходит.
Это откроет ответ:
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);
Чаще всего arg
не меняется (т.е. у вас есть случай 2).Если это так, что-то портит выделенную вами строку.Valgrind, уже предложенный, но доступный только в Linux, AIX и MacOSX, имеет только 50:50 шанс найти проблему.То, что вы действительно хотите, - это точка наблюдения GDB: установите точку останова в начале process_args
, после нажатия выполните (gdb) watch *(long*)arg
и continue
.GDB остановится, когда что-то запишется в *arg
(фактически остановится при следующей инструкции).Затем используйте команду (gdb) where
, чтобы выяснить, что происходит.
Если у вас на самом деле arg
изменяется его значение (случай 1), это может быть сложнее для отладки, и указывает на повреждение стека какого-либо роданарушение правил вызова процедур для вашей платформы.Valgrind, скорее всего, не поможет с этим.Это больше соответствует поведению, которое вы описали: комментирование несвязанного кода приводит к смещению ошибки.
Хотя я не могу дать никаких дополнительных советов по отладке варианта 1, так как вы не раскрыли, что такое актуальная платформа.