Как отслеживать указатель, переходящий от одной функции к другой в gdb

#c #gdb

#c #gdb

Вопрос:

Пожалуйста, рассмотрите:

 void bar (int* ptr3)  
{  
    printf ("n*ptr3 =%dn",*ptr3);  
}  

void foo (int* ptr2)  
{  
    *ptr2  =5;  
    bar (ptr2);  
}  

int main()  
{  
    int numb = 5;  
    int *ptr = amp;numb;  

    foo (ptr);  

    printf("nHello !!!n");  

    return 0;  
}  
  

Возможно ли отслеживать ptr таким образом, чтобы в какой-то момент я мог узнать обратную трассировку переменной, что-то вроде:

 bar() : ptr3
foo() : *ptr2  =5; 
main(): int *ptr = amp;numb;
  

Грубо говоря: можем ли мы каким-либо образом получить историю указателей в gdb.

На самом деле, это может помочь в устранении утечек памяти / UMR, о которых сообщается через Purify.

Спасибо.

Ответ №1:

Ваш вопрос очень неясен, как и в вашем примере ptr3 == ptr2 == ptr == amp;numb , так что именно вы подразумеваете под «историей указателей»?

Похоже, что вы просите отслеживать изменения в значении, на ptr которое указывает (т. е. изменения в numb ). Вы можете сделать это с помощью контрольных точек GDB.

Комментарии:

1. Не отслеживается значение. Но просматривать обратные трассировки (соответствующие переменной pointer) в любой момент времени. Возможно ли это? — Спасибо.

2. Извините, но я совершенно не понимаю, о чем вы просите.

3. Предположим, ptr передается следующим образом: func1 { *ptr определен, func2_called(ptr) } ………. func2 (*ptr) { изменяет значение и передает ptr в func3(). Возможно ли выполнить обратную трассировку для самого PTR, чтобы получить трассировку типа: func3() —> func2()—> func(1).