在调试代码时,我对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;
}
db.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行两次。我的问题是为什么会这样,这是否有害?我可以改变的东西吗?效率低下?只是对我来说没有多大意义。