Skip to content

Commit 14de088

Browse files
committed
refactor(scripts): improve race condition detection in capture_race_state.gdb
- Replace hardcoded pointer checks with dynamic state tracking - Add backtrace on pointer value changes - Store initial do_work and next values on first execution - Add newlines for better log readability - Remove redundant backtrace on every worker removal
1 parent 2780f26 commit 14de088

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

scripts/capture_race_state.gdb

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
11
set $cycle = 1
2+
set $do_work = 0
3+
set $next = 0
24

35
break async_context_base_remove_when_pending_worker
46
commands
57
silent
6-
printf "[Cycle: %d] remove worker: %p\n", $cycle, worker
8+
printf "\n[Cycle: %d] remove worker: %p\n", $cycle, worker
79
printf "[INFO] Enter: %llu; Exit: %llu\n", timestamp_enter, timestamp_exit
810
x/4wx worker
911
set $worker = (async_when_pending_worker_t *)worker
1012
p *$worker
11-
if ($worker->do_work != 0x1000a499)
12-
printf "[ERROR] do_work changed from 0x1000a499 to %p!\n", $worker->do_work
13+
if ($worker->do_work != $do_work)
14+
printf "[ERROR] do_work changed from %p to %p!\n", $do_work, $worker->do_work
15+
bt
1316
end
14-
if ($worker->next != 0 && ($worker->next < 0x20000000 || $worker->next > 0x20042000))
15-
printf "[WARNING] next pointer invalid: %p\n", $worker->next
17+
if ($worker->next != $next)
18+
printf "[ERROR] next pointer changed from %p to %p!\n", $next, $worker->next
19+
bt
1620
end
1721
if ($worker->work_pending > 1)
1822
printf "[WARNING] work_pending invalid: %d\n", $worker->work_pending
1923
end
20-
bt
2124
set $cycle = $cycle + 1
2225
continue
2326
end
@@ -26,11 +29,15 @@ break async_context_base_execute_once
2629
commands
2730
silent
2831
set $worker = (async_when_pending_worker_t *)self->when_pending_list
29-
printf "[Cycle: %d] execute once: %p\n", $cycle, $worker
32+
printf "\n[Cycle: %d] execute once: %p\n", $cycle, $worker
3033
printf "[INFO] Enter: %llu; Exit: %llu\n", timestamp_enter, timestamp_exit
3134
if $worker != 0
3235
x/4wx $worker
3336
p *$worker
37+
if $do_work == 0 && $next == 0
38+
set $do_work = $worker->do_work
39+
set $next = $worker->next
40+
end
3441
end
3542
continue
3643
end

0 commit comments

Comments
 (0)