How to determine why my computer crashed?

You can find all messages in /var/log/syslog and in other /var/log/ files. Old messages are in /var/log/syslog.1, /var/log/syslog.2.gz etc. if logrotate is installed.

However, if the kernel really locks up, the probability is low that you will find any related message.

It could be, that only the X server locks up. In this case, you can usually still access the PC over network via ssh (if you have installed it). There is also the Magic SysRq key to unRaw the keyboard such that the shortcuts you tried could work, too.

you can read /var/log/dmesg for any software problems like [ kernel ] , if it was a service error you may read the service's log like apache for example /var/log/apache/error.log

I guess some hardware errors can't have log

I can't give you with exact commands that can help you get data. But general approach to find the culprit is to some how capture output of commands at regular interval. This will help as you will have data from commands executed before system crashed.

You can capture output of these commands by scheduling them using crontab (HowTo: Add Jobs To cron Under Linux or UNIX?).

Alternatively, there is a service SeaLion - Linux server monitoring and debugging tool where you can schedule commands and check your system's status online.