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?
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?
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.
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
}
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)
Co by to zrobić? Kod nie byłby świadomy jego istnienia. –
Zgadzam się z @JamesMcLaughlin mimo wszystko, aby było jasne: ** nie **, to tylko do wglądu. –
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