【问题标题】:gdb ignores my breakpoints and moregdb 忽略我的断点等等
【发布时间】:2014-06-19 10:37:47
【问题描述】:

我有一种情况,我在 gdb 中设置了一个断点,但没有任何影响,程序继续运行。

如果我从 shell 正常运行程序,最终它会在系统日志中打印一些内容(第 483 行)。

所以,我在 gdb 中运行相同的程序,我在这一行 (483) 设置了一个断点并点击运行,但程序并没有在这一行停止,而是继续运行直到结束。

...
Reading symbols from /usr/src/scannedonly-0.21/src/scannedonlyd_clamav...done.
(gdb) b 483
Breakpoint 1 at 0x804a8f1: file scannedonlyd_clamav.c, line 483.
(gdb) run -n
Starting program: /usr/src/scannedonly-0.21/src/scannedonlyd_clamav
[Thread debugging using libthread_db enabled]
HAVE_LIBCLAMAV_CL_INIT: 1
main
mark
mark2
mark3
about to load_engine()
load_engine()
LibClamAV Error: Can't load /usr/local/share/clamav/daily.cvd: Can't allocate memory

Program exited with code 02.
(gdb)

以下是部分源码:

 469 static struct cl_engine *load_engine()
 ...
 480         cl_engine_set_num(tmp, CL_ENGINE_MAX_SCANSIZE, (long long) 1024 * 1024 * 1024 * 5);
 481         cl_engine_set_num(tmp, CL_ENGINE_MAX_FILESIZE, (long long) 1024 * 1024 * 1024 * 5);
 482         if ((ret = cl_load(cl_retdbdir(), tmp, &sigs, CL_DB_STDOPT)) != CL_SUCCESS) {
 483                 syslog(LOG_CRIT, "WARNING2: Loading ClamAV database failed: %s", cl_strerror(ret));
 484                 cl_engine_free(tmp);
 485                 return NULL;

如果我为函数 load_engine() 设置断点,看起来它会为另一个源文件设置断点。

好消息是它在断点处停止,但它就像在块注释中运行(第 493、497 行):

Reading symbols from /usr/src/scannedonly-0.21/src/scannedonlyd_clamav...done.
(gdb) b load_engine
Breakpoint 1 at 0x80496f7: file /usr/include/bits/stdio2.h, line 105.
(gdb) run -n
Starting program: /usr/src/scannedonly-0.21/src/scannedonlyd_clamav -n
[Thread debugging using libthread_db enabled]
HAVE_LIBCLAMAV_CL_INIT: 1
main
mark
mark2
mark3
about to load_engine()

Breakpoint 1, load_engine () at /usr/include/bits/stdio2.h:105
105       return __printf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
(gdb) n
493     #else
(gdb) n
105       return __printf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
(gdb) n
load_engine()
497             }
(gdb) list
492     /*
493     #else
494             if ((ret = cl_load(cl_retdbdir(), &tmp, &sigs, CL_DB_STDOPT))) {
495                     syslog(LOG_CRIT, "WARNING: Loading ClamAV database failed: %s", cl_strerror(ret));
496                     return NULL;
497             }
498             if ((ret = cl_build(tmp))) {
499                     syslog(LOG_CRIT, "WARNING: Building ClamAV engine failed: %s", cl_strerror(ret));
500                     cl_free(tmp);
501                     return NULL;

如果我在 main() 中的另一行 (1200) 设置断点,它会停在正确的行,但在点击下一个时,程序流程会跳过行。 它从第 1200 行到第 1208 行出现在一个“下一个”上,尽管它不应该(我发布了一个“列表”,因此您也可以查看源代码):

Reading symbols from /usr/src/scannedonly-0.21/src/scannedonlyd_clamav...done.
(gdb) b 1200
Breakpoint 1 at 0x804b97e: file scannedonlyd_clamav.c, line 1200.
(gdb) run -n
Starting program: /usr/src/scannedonly-0.21/src/scannedonlyd_clamav -n
[Thread debugging using libthread_db enabled]
HAVE_LIBCLAMAV_CL_INIT: 1
main
mark
mark2
mark3

Breakpoint 1, main (argc=2, argv=0xbffff794) at scannedonlyd_clamav.c:1200
1200    #endif
(gdb) list
1195    #ifdef HAVE_LIBCLAMAV_CL_INIT
1196            if (cl_init(CL_INIT_DEFAULT) != CL_SUCCESS) {
1197                    syslog(LOG_CRIT, "ABORT, failed to initialize libclamav");
1198                    exit(3);
1199            }
1200    #endif
1201            DEBUG_MSG("about to load_engine()\n");
1202            engine[0] = load_engine();
1203            engine[1] = NULL;
1204            current_engine = 0;
(gdb) n
1208            }
(gdb) list
1203            engine[1] = NULL;
1204            current_engine = 0;
1205            if (engine[0] == NULL) {
1206                    syslog(LOG_CRIT, "ABORT, exiting: no clam engine");
1207                    exit(2);
1208            }
1209            memset(&dbstat, 0, sizeof(struct cl_stat));
1210            cl_statinidir(cl_retdbdir(), &dbstat);
1211    #ifndef HAVE_LIBCLAMAV_CL_INIT
1212            memset(&limits, 0, sizeof(struct cl_limits));

我做错了吗? 有什么想法吗?

顺便说一句,“run -n”只是程序在控制台中打印消息的参数。

【问题讨论】:

  • 您的源代码和程序似乎不同步(例如,代码发生了一些变化,但程序没有重新编译)。尝试重新编译(即make clean && make)。
  • 我一开始也是这么想的,但并没有什么不同。同样的问题...

标签: debugging gdb


【解决方案1】:

问题毕竟是源中的 \r 字符。 删除它们可以解决问题。

【讨论】:

    猜你喜欢
    • 2014-01-15
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多