Почему gdb все время отображает optarg как 0x0

Я изучаю, как работают getopt и *getopt_long*. Одна проблема заключается в том, что когда я использую gdb для пошагового запуска следующей простой программы, optarg всегда равен 0x0.
Знаете почему? Это проблема gdb< /strong>?
Я попытался поискать в Интернете и посмотреть ассемблерный код программы, но пока не нашел ответа.
Код отладки указывает, что optarg указывает на agv[3] (значение "16"), как и ожидалось.

#include <unistd.h>
#include <getopt.h>
#include <stdio.h>
static struct option options[] =
{
  /* name     has_arg flag  val */
  { "num",  1, NULL, 'n' },
  { NULL ,  0, NULL , 0  }
};

int main(int argc, char** argv)
{
  int option;
  option = getopt_long( argc, argv, "n:", options, NULL );
  if (option == 'n') {
    printf("%s\n", optarg);
    if (optarg == NULL)
      printf("optarg == NULL\n");
    if (optarg == 0)
      printf("optarg == 0\n");
  }

  return 0;
}

На ГДБ:

    (gdb) run -n 16
    Starting program: /home/ducalpha/clang/misc/a.out -n 16
...
    16          printf("%s\n", optarg);
    (gdb) p optarg
    $1 = 0x0

Выход:

$ ./a.out -n 16
16

person Duke    schedule 07.09.2012    source источник
comment
Уже существует отчет об ошибке, связанный с этой проблемой: sourceware.org/bugzilla/show_bug.cgi. ?id=13800   -  person alk    schedule 07.09.2012


Ответы (1)


(пересмотренный ответ в ответ на пересмотренный вопрос)

Меня устраивает. Результат:

Reading symbols from /home/wally/a.out...done.
(gdb) run -n 16
Starting program: /home/wally/a.out -n 16
16
[Inferior 1 (process 10999) exited normally]
person wallyk    schedule 07.09.2012
comment
Извините, забыл сказать, что выполнял программу в gdb с run -n 16. Цикл для простоты не включал. - person Duke; 07.09.2012
comment
Что ж, обычный запуск работает как положено. Однако мне интересно, почему gdb отображает значение optarg как 0x0, когда я прошел через программу. - person Duke; 07.09.2012
comment
@Duke: если бы вы не установили аргументы программы (с помощью set args -n 16), программа не могла бы их обрабатывать. Чтобы выполнить программу, вы должны использовать либо команду start, либо установить точку останова и использовать ту же команду запуска. Что ты сделал? - person wallyk; 07.09.2012
comment
В gdb я сделал точку останова на main() и запустил программу, используя run -n 16 - person Duke; 07.09.2012
comment
@Duke: похоже, он выводит 16. Программа вышла? В какой момент казни вы исследовали optarg? - person wallyk; 07.09.2012
comment
Я проверил optarg в строке 16 printf("%s\n", optarg); (после команды if). В этот момент программа не завершилась. Я использовал команду gdb next, чтобы добраться до этой строки. - person Duke; 07.09.2012
comment
@Duke: Вы правы. Что-то очень странное происходит, когда gdb проверяет optarg. Похоже, это проблема управления символами, возможно, связанная с характеристиками библиотеки времени выполнения. Это ситуация, когда отладка с использованием printf() лучше использования отладчика. - person wallyk; 07.09.2012