The first thing you need to do is set up SQL Server so you can get in during the lock-up.
Brent Ozar explains the Remote Dedicated Admin Connection here. Turn that on so you can have an administrative "Back door" that ought to be up even if nothing else is.
From there, try to see what processes are running during the lock-ups. Perhaps there's something in the
sys.dm_exec_connections views that can point to what's locking, assuming the database knows what's going on.
You might also set up a scheduled job to run this query once every 5 minutes during business hours (or whenever the lock-ups occur), and either send you the data or store it in a table somewhere.
@@servername, sess.session_id, sess.login_time,
sess.host_name, sess.program_name, sess.login_name,
sess.nt_domain, sess.nt_user_name, sess.status,
requ.start_time, sess.cpu_time, requ.cpu_time,
sess.memory_usage, sess.reads session_reads, sess.writes,
sess.logical_reads, conn.num_reads, conn.num_writes,
conn.last_read, conn.last_write, requ.blocking_session_id,
requ.wait_type, requ.wait_time, conn.client_net_address,
requ.command, db1.name, sql1.text, sql2.text
from sys.dm_exec_sessions sess
left join sys.dm_exec_connections conn on conn.session_id = sess.session_id
left join sys.dm_exec_requests requ on requ.session_id = sess.session_id
outer APPLY sys.dm_exec_sql_text(requ.sql_handle) sql1
outer APPLY sys.dm_exec_sql_text(conn.most_recent_sql_handle) sql2
left join sys.databases db1 on db1.database_id = requ.database_id
From that, you might see if something shows in the blocking_session_id column or wait_type columns near the time of your error.
Also don't forget to check your WINDOWS event logs on the server. Sometimes SQL Server events are written there, as well.