Установка CFLAGS для pr_debug и printk - PullRequest
6 голосов
/ 26 февраля 2011

Я пытаюсь понять модуль ядра Linux и хотел бы увидеть вывод pr_debug и printk. Я использую GNU Make.
Я понимаю, что для получения pr_debug сообщений мы должны использовать DDEBUG.

Итак, как мне включить printk операторов?

Допустим, имя файла kvm.c. В чем разница между этими двумя:

      CFLAGS_kvm.o := -DDEBUG
      CFLAGS_kvm.o += -DDEBUG

Что делает это утверждение:

      CFLAGS_kvm.o := -I.

[Изменить]:
Похоже, мое использование квадратных скобок вызвало некоторую путаницу. На самом деле под [имя файла] я имел в виду какой-то файл, скажем kvm.c.

Ответы [ 2 ]

4 голосов
/ 11 марта 2014

С https://www.kernel.org/doc/local/pr_debug.txt:

pr_debug()

Some files call pr_debug(), which is ordinarily an empty macro that discards
its arguments at compile time.  To enable debugging output, build the
appropriate file with -DDEBUG by adding

  CFLAGS_[filename].o := -DDEBUG

to the makefile.

For example, to see all attempts to spawn a usermode helper (such as
/sbin/hotplug), add to lib/Makefile the line:

    CFLAGS_kobject_uevent.o := -DDEBUG

Then boot the new kernel, do something that spawns a usermode helper, and
use the "dmesg" command to view the pr_debug() output.
1 голос
/ 26 февраля 2011

Я не знаю, как активировать printk() - что вы искали в Google? Среди прочего, я обнаружил этот , что, по-видимому, означает, что printk() почти всегда доступен (но вы должны пометить сообщения соответствующим уровнем, и, вероятно, есть контроль над тем, какие уровни отображаются на консоль).

Квадратные скобки в имени макроса неортодоксальны - и, следовательно, возможно, являются расширениями, специфичными для вашей системы.

Читая между строк, вполне вероятно, что вы говорите о ядре Linux и, следовательно, о GNU Make, но вы бы помогли всем, если бы вы сказали такие вещи.

Обозначение := является непосредственным присвоением переменной. RHS оценивается, когда строка читается и обрабатывается, а не когда используется макрос, как обычно. Это означает, что если на RHS имеются макросы, последующие изменения этих макросов не повлияют на значение этого макроса. Рассмотрим:

CFLAGS  = ${OFLAGS} ${IFLAGS} ${DFLAGS} ${WFLAGS}
CFLAGS := ${OFLAGS} ${IFLAGS} ${DFLAGS} ${WFLAGS}

Первый вариант отмечает, что CFLAGS будет сформирован из 4 названных макросов (ну, на самом деле, он просто копирует строку, готовую для последующего расширения), но не расширяет значения, пока не будет использован (предположительно) в компиляции C команда.

Второй вариант сразу ищет значения 4 макросов в момент чтения строки и расширяет их. Последующие изменения в 4 ссылочных макросах не отражены в CFLAGS.

Запись += добавляет RHS к макросу, а не просто заменяет его.

...