Дерево выглядит следующим образом:
module M
type A
real , allocatable :: dd (:)
end type A
type B
type (A) , pointer :: aa
end type B
type C
type(B) , pointer :: bb
end type C
type(C) , allocatable :: cc(:)
end module M
В GDB:
print M::cc(10) % bb % aa % dd(100)
$1 = 0
Однако
info address M::cc(10) % bb % aa % dd (100)
генерирует ошибку: без символа "cc (10)% bb% aa% dd (100) "в текущем контексте.
whatis address M::cc(10) % bb % aa% dd(100)
генерирует ошибку: не удается получить доступ к памяти по адресу 0xa0
Я вижу, что флаг компилятора" -g "должен быть указан для доступа к глобальным переменным, но это не помогло.
Причина, по которой мне нужен адрес, - watch M::cc(10) %bb % aa % dd (100)
с программной точкой наблюдения, чтобы я не сильно замедлял GDB.Я надеюсь, что это даст мне представление о строках кода, которые изменяют значение dd (100)
.
Один вариант, который я уже исследовал, - это просто пойти дальше и установить точку наблюдения с помощью:
watch cc(10) % bb % aa % dd ( 100 )
Но это приводит к нескольким сотням точек наблюдения с номерами 1.1, 1.2, 1.3.... 1.500!Это действительно замедляет выполнение в GDB.
Так как я могу получить доступ к адресу?Если это невозможно, какова лучшая альтернатива?