在调试我的代码时,我被 gdb 彻底搞糊涂了。调试器似乎无缘无故地跨过我的两行代码两次。这是我的代码造成的吗?
gdb 的输出很容易解释。我确实尝试删除初始化并将代码连接到一个主函数,并且当编译的 gdb 按预期工作并且似乎不像我在单独的函数中调用相同的代码时那样循环。
mariadb_helper.c
#include "mariadb_helper.h"
void finish_w_error(MYSQL *con) {
fprintf(stderr, "%s\n", mysql_error(con));
mysql_close(con);
exit(1);
}
MYSQL *connect_db(const char *host, const char *user, const char *passwd, const char *db) {
MYSQL *c = mysql_init(NULL);
if(c == NULL) {
fprintf(stderr, "%s\n", mysql_error(c));
exit(1);
}
if(mysql_real_connect(c, host, user, passwd, NULL, 0, NULL, 0) == NULL) {
finish_w_error(c);
}
return c;
}
数据库
#include "mariadb_helper.h"
int main(int argc, char **argv) {
MYSQL *con = connect_db("localhost", "db", "68qrr*", NULL);
if(con == NULL) {
fprintf(stderr, "%s\n", mysql_error(con));
exit(1);
}
mysql_close(con);
return 0;
}
gdb 输出 - 注意第 14 行和第 16 行似乎被调用了两次?这是什么原因造成的?
(gdb) b main
Breakpoint 1 at 0x4006c0: file db.c, line 7.
(gdb) run
Starting program: /home/jasin/dev/c/mariadb/db
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, main (argc=1, argv=0x7ffffffee688) at db.c:7
7 int main(int argc, char **argv) {
(gdb) n
9 MYSQL *con = connect_db("localhost", "db", "68qrr*", NULL);
(gdb) s
connect_db (host=host@entry=0x40097e "localhost", user=user@entry=0x40097b "db",
passwd=passwd@entry=0x400974 "68qrr*", db=db@entry=0x0) at mariadb_helper.c:14
14 MYSQL *connect_db(const char *host, const char *user, const char *passwd, const char *db) {
(gdb) n
16 MYSQL *c = mysql_init(NULL);
(gdb) n
14 MYSQL *connect_db(const char *host, const char *user, const char *passwd, const char *db) {
(gdb) n
16 MYSQL *c = mysql_init(NULL);
(gdb) n
18 if(c == NULL) {
(gdb)
我希望调试器逐行遍历代码,而不是循环回调用函数并重复第 16 行两次。我的问题是为什么会发生这种情况,它有害吗?我可以改变什么?低效?这对我来说没有多大意义。