MySQL 连接器/C++ 1.1 开发人员指南  /  第 8 章连接器/C++ 调试跟踪

第 8 章连接器/C++ 调试跟踪

虽然调试器可用于调试应用程序的特定实例,但您可能会发现启用连接器的调试跟踪很有用。有些问题是随机发生的,这使得它们很难使用调试器进行调试。在这种情况下,调试跟踪和协议文件更有用,因为它们允许您跟踪程序所有实例的活动。

Connector/C++ 可以写入两个跟踪文件:

  1. MySQL 客户端库生成的跟踪文件

  2. Connector/C++ 内部生成的跟踪文件

第一个跟踪文件可以由底层 MySQL 客户端库 ( libmysqlclient) 生成。要启用此跟踪,连接器会在 mysql_debug()内部调用 C API 函数。因为只有调试版本的 MySQL 客户端库能够编写跟踪文件,所以针对库的调试版本编译连接器/C++ 以使用此跟踪。跟踪显示内部函数调用和内部对象的地址,如下所示:

>mysql_stmt_init
| >_mymalloc
| | enter: Size: 816
| | exit: ptr: 0x68e7b8
| <_mymalloc | >init_alloc_root
| | enter: root: 0x68e7b8
| | >_mymalloc
| | | enter: Size: 2064
| | | exit: ptr: 0x68eb28
[...]

第二个跟踪是连接器/C++ 内部跟踪。只要您在编译时启用了跟踪模块,它就可用于连接器的调试和非调试版本。默认情况下,跟踪功能不可用,预处理器会删除对跟踪函数的调用。要启用跟踪模块,请使用CMake选项 配置连接器/C++ 。-DMYSQLCPPCONN_TRACE_ENABLE=1

在启用跟踪功能的情况下编译连接器会导致每个连接器函数调用两次额外的跟踪函数调用。例如:

|  INF: Tracing enabled
<MySQL_Connection::setClientOption
>MySQL_Prepared_Statement::setInt
|  INF: this=0x69a2e0
|  >MySQL_Prepared_Statement::checkClosed
|  <MySQL_Prepared_Statement::checkClosed
| <MySQL_Prepared_Statement::setInt
[...]

运行您自己的基准测试以了解这将对您的应用程序性能产生多大影响。

使用循环运行 30,000 个 INSERTSQL 语句的简单测试显示没有显着的实时影响。此应用程序的两个变体使用连接器的跟踪启用和跟踪禁用版本表现同样出色。只要未启用写入调试跟踪,实时测量的运行时间就不会受到显着影响。但是,在应用程序中花费的时间会有所不同。编写调试跟踪时,I/O 子系统可能成为瓶颈。

总之,请谨慎使用启用跟踪的连接器构建。启用跟踪的版本可能会导致更高的 CPU 使用率,即使您的应用程序的整体运行时间没有受到显着影响。

来自的示例examples/debug_output.cpp 演示了如何激活程序中的调试跟踪。目前它们只能通过 API 调用激活。跟踪是在每个连接的基础上控制的。您可以使用 setClientOption()连接对象的方法来激活和停用跟踪生成。MySQL 客户端库跟踪始终将其跟踪写入文件,而连接器将协议消息写入标准输出。

sql::Driver *driver;
int on_off = 1;

/* Using the Driver to create a connection */
driver = get_driver_instance();
std::auto_ptr< sql::Connection > con(driver->connect(host, user, pass));

/*
Activate debug trace of the MySQL client library (C API)
Only available with a debug build of the MySQL client library!
*/
con->setClientOption("libmysql_debug", "d:t:O,client.trace");

/*
Connector/C++ tracing is available if you have compiled the
driver using cmake -DMYSQLCPPCONN_TRACE_ENABLE:BOOL=1
*/
con->setClientOption("clientTrace", &on_off);