Я считаю cscope может помочь решить вопрос.Это инструмент разработчика для просмотра исходного кода .Он может получить функцию вызова следующим образом:
1. Перейдите в каталог исходного кода , затем сгенерируйте файл базы данных cscope с именем cscope.out
cd libvirt
cscope -bR
Найдите
вызывающих абонентов из
func1 по cscope:
cscope -d -f cscope.out -L3 func1
, тогда
2-й столбец является вызывающими для этой функции.Например:
cscope -d -f./cscope.out -L3 qemuMigrationDstPrepareDirect
Результат:
src/qemu/qemu_driver.c ATTRIBUTE_NONNULL 12487 ret = qemuMigrationDstPrepareDirect(driver, dconn,
src/qemu/qemu_driver.c qemuDomainMigratePrepare2 12487 ret = qemuMigrationDstPrepareDirect(driver, dconn,
src/qemu/qemu_driver.c qemuDomainMigratePrepare3 12722 ret = qemuMigrationDstPrepareDirect(driver, dconn,
src/qemu/qemu_driver.c qemuDomainMigratePrepare3Params 12809 ret = qemuMigrationDstPrepareDirect(driver, dconn,
Обратите внимание, что: cscope будет ошибочно считать объявление атрибута функции ATTRIBUTE _ * вызывающим.Мы должны их пропустить.
Затем рекурсивно найти вызывающую функцию a.Наконец, выберите цель B -> ...-> A трассировка вызова.