#c #linux #gdb #x86
#c #linux #gdb #x86
Вопрос:
в руководстве по gdb говорится следующее.
Предупреждение: В многопоточных программах программные контрольные точки имеют лишь ограниченную полезность. Если gdb создает программную контрольную точку, она может отслеживать значение выражения только в одном потоке. Если вы уверены, что выражение может измениться только из-за активности текущего потока (и если вы также уверены, что никакой другой поток не может стать текущим), то вы можете использовать программные контрольные точки как обычно. Однако gdb может не заметить, когда активность текущего потока изменяет выражение. (Аппаратные контрольные точки, напротив, отслеживают выражение во всех потоках.)
Итак, как я могу использовать контрольную точку с несколькими потоками, использующими gdb, таким образом, чтобы gdb видела изменение наблюдаемой переменной из любого потока?
Ответ №1:
В общем, программные контрольные точки действительно дороги. Вы могли бы использовать аппаратную контрольную точку, если вы просматриваете скалярные данные, адрес которых четко определен, что-то вроде
p amp;myvar
$1 = (int*) 0x1234556
watch *(int*) 0x1234556
Это относится только к простым скалярным данным (одиночный указатель, одно целое число, один байт …)
Комментарии:
1. Итак, как мне сказать gdb использовать аппаратную контрольную точку вместо программной?
2. Именно gdb выбирает, как она реализует контрольную точку. Аппаратные контрольные точки возможны только на очень немногих скалярных (фиксированных) адресах.
3. Убедитесь, что ваша gdb действительно может использовать контрольные точки hw:
(gdb) show can-use-hw-watchpoints
.4. Но работает ли это для многопоточных приложений? Я имею в виду, что gdb может видеть изменение переменной любым потоком?
5. Я полагаю, что да. Аппаратные контрольные точки управляются аппаратными регистрами, и они должны быть у каждого ядра.