Дерево выглядит следующим образом
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.
Итак, как я мог получить доступ к адресу? Если это невозможно, какая альтернатива лучше?
@RodrigoRodrigues отредактировал сейчас, я вижу путаницу. Это действительно d (:)
@ chw21 отредактировал сообщение
Хотя это не связано с gdb, возможно ли это изменить результат, если указатель по умолчанию имеет значение null как «type (A), pointer :: aa => null ()» (и аналогично bb) в определении типа?
Это размещаемый @RodrigoRodrigues, а не опечатка.