Я пытаюсь напечатать связанный список Linux в удобном для пользователя способом в Trace32.Показать связанный список Linux в Trace32
1. Есть ли какой-либо известный способ?
Если нет, то позвольте мне показать пример с modules.
У меня есть глобальная переменная
static struct list_head modules;
где
struct list_head {
struct list_head *next, *prev;
};
Так, в Т32 я просто увидеть список ближайших и предыдущая указатели при выполнении v.v modules
, никакой полезной информации на самом деле. Однако каждый узел списка модулей является частью типа контейнера. В этом случае struct module
struct module {
...
struct list_head list;
...
}
Обычно, чтобы извлечь указатель контейнера Linux использует container_of макрос.
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) *__mptr = (ptr); \
(type *)((char *)__mptr - offsetof(type,member));})
В нашем примере мы знаем, указатель на struct list_head
который является list
членом struct module
тогда мы должны называть container_of(modules->next, struct module, list)
, чтобы получить указатель на контейнер.
Чтобы иметь возможность архивировать это в T32, мне нужно вычислить смещение члена list
в типе контейнера.
Кто-нибудь знает, как этого достичь?
Просто уточнить. Вопрос 1 заключался в том, как отображать ** связанные с Linux ** списки. 'Var.CHAIN' не выполняет эту работу в этом случае. Ответ на вопрос 2 был по существу. Большое спасибо. – wrymarkX
ОК, просто узнал, что такое «Линукс связанные списки». Я уверен, что приятный просмотр списка модулей, соединенных вместе через list_head, невозможно с помощью TRACE32. Кроме того, я предполагаю, что отладчик может просматривать этот список только в том случае, если смещение «следующего» элемента внутри содержащего модуля фиксировано для всех модулей связанного списка. Предлагаю обратиться в службу поддержки Lauterbach. Возможно, они могут добавить подходящую функцию, если это возможно (они обычно делают). – Holger
С помощью 'container_of()' макроса, который вы предложили, и цикла я могу сделать работу довольно хорошо. Другой аспект заключается в том, что список не заканчивается нулевым, вместо этого я вижу next = 0x55555555. Не понимаю, если это конкретная обработка Linux. – wrymarkX