GDB показывает неверные аргументы функции при входе в функцию C - PullRequest
1 голос
/ 18 апреля 2020

Отладка C программы с помощью GDB Я вижу следующее (сокращенно):

(gdb)
1808            found = readOptionFromFile(options_file,...
(gdb) p options_file
$1 = (FILE *) 0xa812140
(gdb) s
readOptionFromFile (file=0x0, ...) at options.c:376
376 bool readOptionFromFile(FILE *file, ... {
(gdb) p file
$2 = (FILE *) 0x0
(gdb) n
378         int len, argc, i, c, isActiveSection, isActivePass, passn=0;
(gdb) p file
$3 = (FILE *) 0xa812140
(gdb)

Обратите внимание, что после входа в функцию GDB представляет аргументы, в частности формальный аргумент file, как 0x0, что не соответствует ожиданиям, поскольку фактический аргумент options_file был напечатан как 0xa812140 непосредственно перед вызовом. Даже печать на этом этапе показывает это неверное значение. Тем не менее, после next последующего p его снова будет показано значение 0xa812140.

Я могу понять это с технической точки зрения (прологи функций, стековые фреймы и т. Д.), Но как пользователь, я бы действительно хочу правильный вывод из GDB. Это известное / ожидаемое поведение или ошибка?

Я использую GNU gdb (Ubuntu 8.3-0ubuntu1) 8.3 на

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=19.10
DISTRIB_CODENAME=eoan
DISTRIB_DESCRIPTION="Ubuntu 19.10"

(На самом деле на WSL)

1 Ответ

1 голос
/ 18 апреля 2020

Хотя в G CC руководстве прямо говорится:

-O0
    Reduce compilation time and make debugging produce the expected results.
    This is the default.

Конечно, вы могли бы обсудить часть "ожидаемых результатов" ...

Но он также продолжает указывать

-Og
    Optimize debugging experience. -Og should be the optimization level of choice
    for the standard edit-compile-debug cycle, offering a reasonable level of
    optimization while maintaining fast compilation and a good debugging experience. 
    It is a better choice than -O0 for producing debuggable code because some
    compiler passes that collect debug information are disabled at -O0.

Использование -Og должно решить проблему.

ОБНОВЛЕНИЕ: я обнаружил, что лучшим вариантом для отладки часто может быть -O0, поскольку -Og позволяет оптимизировать многие переменные из-за правила как если бы . Существует проблема с этим с 2016 года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...