Skip to content

Simple Dead Lock Trace

A server trace that captures only deadlock graph events for a fixed window.

Published Feb 18, 2007

The minimal deadlock catcher. This script creates a server-side trace that records nothing but the Lock:Deadlock Chain event - with the deadlock XML, duration, SPID, start time, database and login columns - running for as long as you set at the top (default one hour) or until the file hits its size cap. The trace keeps running in the background; the commented section at the bottom shows how to stop, start or delete it later by trace id.

------------------------------------------------------------------------------------------------------------------------
-- Create a Queue
------------------------------------------------------------------------------------------------------------------------
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
declare @DateTime datetime

set @DateTime = DateAdd(HH, 24, GetDate()) --Run for x Hours.
set @maxfilesize = 1024 --Run untill the file reaches x MB.

--The .trc extension will be appended to the filename automatically.
exec @rc = sp_trace_create @TraceID output, 0, N'D:\TraceFileName', @maxfilesize, @DateTime
if (@rc != 0) goto error

------------------------------------------------------------------------------------------------------------------------
-- Set the events
------------------------------------------------------------------------------------------------------------------------
declare @on bit
set @on = 1
exec sp_trace_setevent @TraceID, 148, 11, @on
exec sp_trace_setevent @TraceID, 148, 51, @on
exec sp_trace_setevent @TraceID, 148, 4, @on
exec sp_trace_setevent @TraceID, 148, 12, @on
exec sp_trace_setevent @TraceID, 148, 14, @on
exec sp_trace_setevent @TraceID, 148, 26, @on
exec sp_trace_setevent @TraceID, 148, 60, @on
exec sp_trace_setevent @TraceID, 148, 64, @on
exec sp_trace_setevent @TraceID, 148, 1, @on
exec sp_trace_setevent @TraceID, 148, 41, @on

------------------------------------------------------------------------------------------------------------------------
-- Set the trace status to start
------------------------------------------------------------------------------------------------------------------------
exec sp_trace_setstatus @TraceID, 1

------------------------------------------------------------------------------------------------------------------------
-- display trace id for future references
------------------------------------------------------------------------------------------------------------------------
select TraceID=@TraceID
goto finish

error: 
select ErrorCode=@rc

finish: 
go

SELECT * FROM ::fn_trace_getinfo(NULL)

------------------------------------------------------------------------------------------------------------------------
--Control running traces:
------------------------------------------------------------------------------------------------------------------------
--EXEC sp_trace_setstatus @traceid = 3, @status = 0 --Stop
--EXEC sp_trace_setstatus @traceid = 3, @status = 1 --Start
--EXEC sp_trace_setstatus @traceid = 3, @status = 2 --Delete
An unhandled error has occurred. Reload 🗙