24.3 Dbug休眠

如果普通服务器代码在关键位置没有块点,则可以插入人工同步点。

open_tables(…)DBUG_EXECUTE_IF("sleep_open_and_lock_after_open", {const char *old_proc_info= thd->proc_info;thd->proc_info= "DBUG sleep";my_sleep (6000000);(thd - > proc_info = old_proc_info;});lock_tables(…)

在这种情况下,如果设置了'debug'关键字'sleep_open_and_lock_after_open',线程将在open_tables()之后和lock_tables()之前休眠6秒。在休眠之前,它将线程状态(proc_info)设置为“DBUG sleep”。使用这个同步点的测试文件如下所示:

——connection conn1 let $conn1_id= ' SELECT CONNECTION_ID() ';#系统变量“debug”只存在于调试服务器中——错误0,ER_UNKNOWN_SYSTEM_VARIABLE SET SESSION debug="+d,sleep_open_and_lock_after_open";INSERT INTO t1 VALUES (1)——connection conn2 #指定显示conn1是否达到同步点的条件。让$wait_condition= SELECT 1 FROM INFORMATION_SCHEMA处理列表中ID = $conn1_id AND STATE = 'DBUG sleep';在循环中运行条件,直到它变为true。——包括/ wait_condition来源。运行关键代码。FLUSH TABLE t1;

因此可以在几乎所有地方添加同步点。但代价是浪费了睡眠和等待的时间。

此方法要求修改和重新编译服务器代码。另一个问题是同步点在非调试服务器中不存在。在非调试服务器中甚至不存在系统变量'debug'。必须编写每个测试,以便它既能在调试服务器上工作,也能在非调试服务器上工作。如果这是不可能的,测试必须移动到一个测试文件,其中包括'have_debug.inc'。设置可能不存在的变量可以通过——error 0, ER_UNKNOWN_SYSTEM_VARIABLE命令来保护。它表示下一个语句可以成功(0)或失败(ER_UNKNOWN_SYSTEM_VARIABLE)。

最后,当应该使用DBUG工具跟踪执行时,该方法是糟糕的。设置一个(或多个)'debug'关键字禁用所有其他关键字。对于有意义的跟踪,需要添加一个相当长的列表。

底线是:当没有其他方法可以重复一个问题时,使用“Dbug Sleep”方法。但是,“调试同步工具”应该能够替换所有的“Dbug睡眠”同步点。