If you're willing to pay someone to figure it out, you should post a request in the Request for Paid Services forum.
If you're feeling adventurous, you could try editing your includes/functions_cron.php file like this (find this section near the end and replace it with this):
PHP Code:
if ($nextitem)
{
if ($nextrun = build_cron_item($nextitem['cronid'], $nextitem))
{
if (($fp = fopen('cronlog.txt', 'a')) !== NULL)
{
fwrite($fp, date(DATE_ATOM)." PID:".getmypid()." start '".$nextitem['filename']."'\n");
fclose($fp);
}
$time_start = microtime(true);
include_once(DIR . '/' . $nextitem['filename']);
$t = microtime(true) - $time_start;
if (($fp = fopen('cronlog.txt', 'a')) !== NULL)
{
fwrite($fp, date(DATE_ATOM)." PID:".getmypid()." end '".$nextitem['filename']."', run time $t\n");
fclose($fp);
}
}
}
else
{
build_cron_next_run();
}
then after a while you hopefully can look at cronlog.txt and find the tasks that aren't ending. Of course you'll still have to figure out why, but at least you'll know where to look.