No macros. This is one spot where Rust is better than C. (Though it is too limiting for my taste.)
Instead, I use ThreadSanitizer and add locks where I may not even need them. Then I may remove some, or change them to different synchronization primitives, and between every change, run TSan several hundred of thousands of times to tease out any race conditions. It's my way of fuzzing for race conditions.
The really tricky macro though comes when you want to check races in shared mutable state...