GDB Watchpoint кроме случаев, когда срабатывает в определенных местах?
У меня есть переменная повреждена. Я хочу увидеть, где это происходит, поэтому точка наблюдения является очевидным выбором, за исключением того, что эта переменная часто устанавливается (в этом случае обработка сетевых пакетов и она устанавливается один раз для каждого пакета). Я хотел бы освободить точку наблюдения от места, где переменная должна быть записана. В основном, что я хотел бы, это "смотреть переменную, если line_number!= X"; Документы GDB, кажется, немного тонкие в условных выражениях, поэтому я не уверен, что это возможно...
1 ответ
Есть несколько способов сделать это в следующем исходном файле.
struct stuff {
int watched;
};
void dont_hit(struct stuff *foo) {
begin:
for (int i = 0; i < 100; i++)
foo->watched = i;
end:
return;
}
void hit(struct stuff *foo) {
foo->watched = 1024;
}
int main()
{
struct stuff foo;
setup:
dont_hit(&foo);
hit(&foo);
dont_hit(&foo);
}
Затем мы можем использовать условие наблюдения: если $pc!= ..., как показано ниже:
(gdb) break main
(gdb) r
(gdb) watch foo.watched
(gdb) c
Hardware watchpoint 2: foo.watched
Old value = -8320
New value = 0
dont_hit (foo=0x7fffffffde90) at main.c:7
7 for (int i = 0; i < 100; i++)
(gdb) p $pc
$1 = (void (*)()) 0x4004c0 <dont_hit+26>
(gdb) watch -location foo->watched if $pc != 0x4004c0
ardware watchpoint 3: -location foo->watched
(gdb) delete 2
(gdb) c
Continuing.
Hardware watchpoint 3: -location foo->watched
Old value = 99
New value = 1024
hit (foo=0x7fffffffde90) at main.c:15
Другой способ - использовать точки останова для включения / выключения точки наблюдения в тех местах, где мы не хотим, чтобы она срабатывала. Я использую метку здесь setup/begin/end для ясности, но вы можете заменить main:label именем файла:line_number
break main:setup
run
watch -location foo.watched
break dont_hit:begin
commands
silent
disable 2
cont
end
break dont_hit:end
commands
silent
enable 2
cont
end
Третий способ - использовать Python и FinishBreakpoints для включения / выключения.