Starting to Debug Event Recording
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next timestamp
t / T Toggle theatre / SUPERtheatre mode
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link c Credits

In-Menu and Index Controls

a
w
s
d
h j k l


Esc Close menu / unfocus timestamp

Quotes and References Menus and Index

Enter Jump to timestamp

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
0:08Recap and plan for today
0:08Recap and plan for today
0:08Recap and plan for today
1:19We'll be debugging our event record visualization
1:19We'll be debugging our event record visualization
1:19We'll be debugging our event record visualization
2:25Quick review of the code relevant to the task
2:25Quick review of the code relevant to the task
2:25Quick review of the code relevant to the task
3:29Are we building the debug frames properly?
3:29Are we building the debug frames properly?
3:29Are we building the debug frames properly?
4:02Checking that the frame count is correct
4:02Checking that the frame count is correct
4:02Checking that the frame count is correct
5:32There are too few regions inside a frame
5:32There are too few regions inside a frame
5:32There are too few regions inside a frame
6:18Stepping through the code looking for the cause of that error
6:18Stepping through the code looking for the cause of that error
6:18Stepping through the code looking for the cause of that error
14:15There seems to be a problem with the BEGIN_ and END_BLOCK pairing
14:15There seems to be a problem with the BEGIN_ and END_BLOCK pairing
14:15There seems to be a problem with the BEGIN_ and END_BLOCK pairing
16:55Stopping when we hit the END_BLOCK event of the GameUpdate counter
16:55Stopping when we hit the END_BLOCK event of the GameUpdate counter
16:55Stopping when we hit the END_BLOCK event of the GameUpdate counter
17:46Implementing StringsAreEqual
17:46Implementing StringsAreEqual
17:46Implementing StringsAreEqual
21:52The opening and closing GameUpdate events don't match at all
21:52The opening and closing GameUpdate events don't match at all
21:52The opening and closing GameUpdate events don't match at all
23:24The hierarchy of nested events seems too deep
23:24The hierarchy of nested events seems too deep
23:24The hierarchy of nested events seems too deep
25:33Is END_BLOCK_ not working properly?
25:33Is END_BLOCK_ not working properly?
25:33Is END_BLOCK_ not working properly?
27:08Examining DrawRectangle
27:08Examining DrawRectangle
27:08Examining DrawRectangle
29:47DrawRectangle is called from multiple threads
29:47DrawRectangle is called from multiple threads
29:47DrawRectangle is called from multiple threads
31:37Could the code that deals with multiple threads be wrong?
31:37Could the code that deals with multiple threads be wrong?
31:37Could the code that deals with multiple threads be wrong?
32:03Stepping through the code at DrawRectangle events
32:03Stepping through the code at DrawRectangle events
32:03Stepping through the code at DrawRectangle events
33:20Drawing rectangles inside the debug code could be the cause of the bug
33:20Drawing rectangles inside the debug code could be the cause of the bug
33:20Drawing rectangles inside the debug code could be the cause of the bug
35:05What does the global debug table look like when we're timing DrawRectangle?
35:05What does the global debug table look like when we're timing DrawRectangle?
35:05What does the global debug table look like when we're timing DrawRectangle?
40:45Some more stepping through the code
40:45Some more stepping through the code
40:45Some more stepping through the code
42:40Examining event writting inside TIMED_FUNCTION
42:40Examining event writting inside TIMED_FUNCTION
42:40Examining event writting inside TIMED_FUNCTION
43:18There are too many end blocks for the same ThreadId
43:18There are too many end blocks for the same ThreadId
43:18There are too many end blocks for the same ThreadId
44:00Is GetThreadId wrong?
44:00Is GetThreadId wrong?
44:00Is GetThreadId wrong?
45:29Testing GetThreadId at thread creation time. It checks out
45:29Testing GetThreadId at thread creation time. It checks out
45:29Testing GetThreadId at thread creation time. It checks out
49:37Substituting TIMED_FUNCTION with paired BEGIN_ and END_BLOCKs to avoid constructor/destructor pairs
49:37Substituting TIMED_FUNCTION with paired BEGIN_ and END_BLOCKs to avoid constructor/destructor pairs
49:37Substituting TIMED_FUNCTION with paired BEGIN_ and END_BLOCKs to avoid constructor/destructor pairs
53:06We're out of hypotheses. Let's freeze some threads to run them in order
53:06We're out of hypotheses. Let's freeze some threads to run them in order
53:06We're out of hypotheses. Let's freeze some threads to run them in order
56:15The problem seems to disappear when we run the threads in order. But why?
56:15The problem seems to disappear when we run the threads in order. But why?
56:15The problem seems to disappear when we run the threads in order. But why?
59:10Verifying that GetThreadId returns a u16
59:10Verifying that GetThreadId returns a u16
59:10Verifying that GetThreadId returns a u16
1:00:00Perplexing bugα
1:00:00Perplexing bugα
1:00:00Perplexing bugα
1:01:30Checking that EventArrayIndex is aligned to 8-byte boundaries
1:01:30Checking that EventArrayIndex is aligned to 8-byte boundaries
1:01:30Checking that EventArrayIndex is aligned to 8-byte boundaries
1:06:15Outsourcing the problem to the stream
1:06:15Outsourcing the problem to the stream
1:06:15Outsourcing the problem to the stream
1:06:53We could debug the problem in isolation, on a simpler version of the code
1:06:53We could debug the problem in isolation, on a simpler version of the code
1:06:53We could debug the problem in isolation, on a simpler version of the code
1:07:37Q&A
🗩
1:07:37Q&A
🗩
1:07:37Q&A
🗩
1:08:04TheSizik Try running without timing DrawRectangle
🗪
1:08:04TheSizik Try running without timing DrawRectangle
🗪
1:08:04TheSizik Try running without timing DrawRectangle
🗪
1:10:44Bobo_the_bearded The MSDN documentation for __readgsqword states "These intrinsics are only available in kernel mode, and the routines are only available as intrinsics". If this is the case, how were you able to use __readgsqword to read out the thread ID? (I'm not really sure what the difference between kernel mode and user mode is)
🗪
1:10:44Bobo_the_bearded The MSDN documentation for __readgsqword states "These intrinsics are only available in kernel mode, and the routines are only available as intrinsics". If this is the case, how were you able to use __readgsqword to read out the thread ID? (I'm not really sure what the difference between kernel mode and user mode is)
🗪
1:10:44Bobo_the_bearded The MSDN documentation for __readgsqword states "These intrinsics are only available in kernel mode, and the routines are only available as intrinsics". If this is the case, how were you able to use __readgsqword to read out the thread ID? (I'm not really sure what the difference between kernel mode and user mode is)
🗪
1:12:10qwoodmansee You said that it seems to work normally for a little while, then stops working when it's under stress. Maybe let the threads run wild for a little while, then freeze them? Or is this not possible with the debugger?
🗪
1:12:10qwoodmansee You said that it seems to work normally for a little while, then stops working when it's under stress. Maybe let the threads run wild for a little while, then freeze them? Or is this not possible with the debugger?
🗪
1:12:10qwoodmansee You said that it seems to work normally for a little while, then stops working when it's under stress. Maybe let the threads run wild for a little while, then freeze them? Or is this not possible with the debugger?
🗪
1:16:08Culver_Fly Is it possible that the ArrayIndex part somehow got swapped out during begin / end records?
🗪
1:16:08Culver_Fly Is it possible that the ArrayIndex part somehow got swapped out during begin / end records?
🗪
1:16:08Culver_Fly Is it possible that the ArrayIndex part somehow got swapped out during begin / end records?
🗪
1:16:24Connor_Rentz Did you create your colors to be easy on the eyes? If not, how did they come to be?
🗪
1:16:24Connor_Rentz Did you create your colors to be easy on the eyes? If not, how did they come to be?
🗪
1:16:24Connor_Rentz Did you create your colors to be easy on the eyes? If not, how did they come to be?
🗪
1:16:41dafreaki Didn't you remove the EndBlock call?
🗪
1:16:41dafreaki Didn't you remove the EndBlock call?
🗪
1:16:41dafreaki Didn't you remove the EndBlock call?
🗪
1:20:03handmade_render_group.cpp: Make DoTiledRenderWork a TIMED_FUNCTION
1:20:03handmade_render_group.cpp: Make DoTiledRenderWork a TIMED_FUNCTION
1:20:03handmade_render_group.cpp: Make DoTiledRenderWork a TIMED_FUNCTION
1:21:10handmade_render_group.cpp: Make IGNORED_TIMED_FUNCTION by a TIMED_FUNCTION again
1:21:10handmade_render_group.cpp: Make IGNORED_TIMED_FUNCTION by a TIMED_FUNCTION again
1:21:10handmade_render_group.cpp: Make IGNORED_TIMED_FUNCTION by a TIMED_FUNCTION again
1:22:50elxenoaizd If the debug code is slower than the actual runtime of the game, how can we rely on the debug systems to give us accurate timing of how long things are taking in the game since they naturally take more time in debug mode?
🗪
1:22:50elxenoaizd If the debug code is slower than the actual runtime of the game, how can we rely on the debug systems to give us accurate timing of how long things are taking in the game since they naturally take more time in debug mode?
🗪
1:22:50elxenoaizd If the debug code is slower than the actual runtime of the game, how can we rely on the debug systems to give us accurate timing of how long things are taking in the game since they naturally take more time in debug mode?
🗪
1:25:19handmade_debug.cpp: Render debug information for fewer frames
1:25:19handmade_debug.cpp: Render debug information for fewer frames
1:25:19handmade_debug.cpp: Render debug information for fewer frames
1:29:02SerialQwiller If I remember correctly from the other day, you discard events if buffers are full. Are you sure all buffers are big enough?
🗪
1:29:02SerialQwiller If I remember correctly from the other day, you discard events if buffers are full. Are you sure all buffers are big enough?
🗪
1:29:02SerialQwiller If I remember correctly from the other day, you discard events if buffers are full. Are you sure all buffers are big enough?
🗪
1:29:50build.bat: Switch to -O2
1:29:50build.bat: Switch to -O2
1:29:50build.bat: Switch to -O2
1:31:09TheSizik Could it be threads running across a frame boundary?
🗪
1:31:09TheSizik Could it be threads running across a frame boundary?
🗪
1:31:09TheSizik Could it be threads running across a frame boundary?
🗪
1:33:01Leave it in a state where it is brokenβ
🗩
1:33:01Leave it in a state where it is brokenβ
🗩
1:33:01Leave it in a state where it is brokenβ
🗩