2012-04-23 19 views
17

Wiem, że gdb pozwala na już zadeklarowaną zmienną jako zestaw przy użyciu polecenia set.Jak zadeklarować zmienną w zakresie danej funkcji za pomocą GDB?

Czy jest możliwe, że gdb dynamicznie zadeklaruje nową zmienną wewnątrz zakresu danej funkcji?

+10

Co by to zrobić? Kod nie byłby świadomy jego istnienia. –

+0

Zgadzam się z @JamesMcLaughlin mimo wszystko, aby było jasne: ** nie **, to tylko do wglądu. –

+6

Czy na pewno nie chcesz zmiennej gdb? Możesz * tworzyć * zmienne w kontekście gdb dla wygody, np. 'Set $ ​​foo = ...', a później odwoływać się do '$ foo'. Oczywiście takie zmienne nie są w żaden sposób widoczne dla działającego kodu. – FatalError

Odpowiedz

14

Dla kodu C (i prawdopodobnie C++) byłoby to bardzo trudne, ponieważ w większości implementacji wymagałoby to przesunięcia wskaźnika stosu, co spowodowałoby, że kod wyjścia funkcji zawiodłby z powodu braku zgodności z rozmiarem rama stosu. Również cały kod funkcji, która uzyskuje dostęp do zmiennych lokalnych, nagle ryzykuje trafienie w niewłaściwą lokalizację, która również jest zła.

Tak, nie sądzę, nie.

6

tak właśnie używane do drukowania zmiennych

(gdb) set $path=((ngx_path_t  **)ngx_cycle->paths.elts)[2] 
(gdb) print *$path 
    $16 = { 
     name = { 
      len = 29, 
      data = 0x80ed15c "/usr/local/nginx/fastcgi_temp" 
      }, 
     len = 5, 
     level = {1, 2, 0}, 
     manager = 0, 
     loader = 0, 
     data = 0x0, 
     conf_file = 0x0, 
     line = 0 
    } 
12

można dynamicznie przydzielać trochę miejsca i użyć go do przechowywania nową zmienną. W zależności od tego, co masz na myśli przez "zakres obecnej funkcji", może nie być to, czego chcesz.

Ale o to, jak to wygląda, gdy masz funkcji func(), która pobiera wskaźnik do parametru wyjściowego:

set $foo = alloc(sizeof(struct funcOutStruct)) 
func($foo) 
p *$foo 
free($foo) 
Powiązane problemy