2017-02-06 20 views
3

я пытался отладить va_list аргумент и распечатать код переменного образца значения:отладки va_list арг с помощью GDB

#include <stdarg.h> 
#include <stdio.h> 
double average(int count, ...) 
{ 
    va_list ap; 
    int j; 
    double sum = 0; 
    va_start(ap, count); /* Requires the last fixed parameter (to get the address) */ 
    for (j = 0; j < count; j++) { 
     sum += va_arg(ap, int); /* Increments ap to the next argument. */ 
    } 
    va_end(ap); 
    return sum/count; 
} 
int main(int argc, char const *argv[]) 
{ 
    printf("%f\n", average(3, 1, 2, 3)); 
    return 0; 
} 

так я пытался отладить ар va_list аргумента и я написал

(gdb) p *(int *)(((char *)ap[0].reg_save_area)+ap[0].gp_offset) 

но я получить в результате от GDB

Attempt to dereference a generic pointer. 

здесь изображение для результата:

+0

Приоритет оператора? –

+0

Похоже, что gcc на Ubuntu 16.04 не полностью вводит тип 'ap' в раздел debuginfo исполняемого файла. В нем говорится, что это 'va_list', который является' __gnuc_va_list', но не содержит никакой другой информации для '__gnuc_va_list'. Работает нормально с стандартной версией clang на 16.04. –

+0

Так что я могу сделать, чтобы компилировать с clang? –

ответ

0

Когда вы остановились на линии 8 в БГД, эта строка кода еще не был выполнен:

va_start(ap, count); /* Requires the last fixed parameter (to get the address) */ 

переменная Поэтому ap еще не инициализирован, и вы не можете его распечатать. Вы должны выполнить следующую строку кода и распечатать ap еще раз:

(gdb) n 
9  for (j = 0; j < count; j++) { 
(gdb) p *(int *)(((char *)ap[0].reg_save_area)+ap[0].gp_offset) 
$1 = 1 
+0

У меня все еще есть: попытка разыменовать общий указатель. –

+0

любой, кто должен напечатать что-то вроде (void *) 0x7fff5fbffa18 –

+0

Странно, попробуйте установить bp в строке 9 и напечатать 'ap'. – ks1322