你能为 gdb 中的 'step' 计时吗?

标签 c debugging gdb gtk

我正在使用 gdb (gtk) 调试 C 库。

有一个功能太慢了。我试图找出函数的哪一部分导致了延迟。

我知道一个选项可能是插入手动代码/重新编译到基准代码段,但是有没有办法获得在 gdb 中执行单个步骤“s”所花费的时间?

最佳答案

对于快速和肮脏的分析,你可以把这个片段放在你的 ~/.gdbinit 文件中:

define timeit                                                                                                                                                                             
    python import time
    python start_time = time.time()
    step
    python print("Call took {:.4f} ms".format(time.time() - start_time))
end
document timeit
    Time execution of next function
    Usage: timeit (or ti)
end

下面是一个正在使用的 timeit 函数的例子:

$ gdb --quiet --args ./can-daemon --config=../scripts/handlers.lua vcan0
Reading symbols from ./can-daemon...done.
(gdb) b main.cpp:548
Breakpoint 1 at 0x4c5bd4: file /home/evadeflow/projects/info4/can-daemon/src/main.cpp, line 548.
(gdb) run
Starting program: /home/evadeflow/projects/info4/can-daemon/_build/can-daemon --config=../scripts/handlers.lua vcan0
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Processing messages from: vcan0 

Breakpoint 1, main (argc=3, argv=0x7fffffffdbd8) at /home/evadeflow/projects/info4/can-daemon/src/main.cpp:548
548             auto L = ::InitializeLuaInterpreter(vm, lua_can_handler_map, lua_mqtt_handler_map);
(gdb) ti
(anonymous namespace)::InitializeLuaInterpreter (vm=..., lua_can_handler_map=std::unordered_map with 0 elements, lua_mqtt_handler_map=std::unordered_map with 0 elements)
    at /home/evadeflow/projects/info4/can-daemon/src/main.cpp:469
469 {
Call took 0.0643 ms
(gdb) ti
470     L = luaL_newstate();
Call took 0.0011 ms
(gdb) ti
luaL_newstate () at /home/evadeflow/projects/info4/can-daemon/_build/lua-src/src/lauxlib.c:648                                                                                            
t648      lua_State *L = lua_newstate(l_alloc, NULL);
Call took 0.4028 ms
(gdb) ti
lua_newstate (f=0x7ffff773dbdf <l_alloc>, ud=0x0) at /home/evadeflow/projects/info4/can-daemon/_build/lua-src/src/lstate.c:147
147   void *l = (*f)(ud, NULL, 0, state_size(LG));
Call took: 0.1777 ms
(gdb) ti
l_alloc (ud=0x0, ptr=0x0, osize=0, nsize=616) at /home/evadeflow/projects/info4/can-daemon/_build/lua-src/src/lauxlib.c:630
630   if (nsize == 0) { 
Call took 0.0028 ms
(gdb) ti
635     return realloc(ptr, nsize);
Call took 0.0011 ms
(gdb)

不如 gprof 准确,但是如果您只是想大致了解每个步骤相对于其他步骤花费的时间,会容易得多。

关于你能为 gdb 中的 'step' 计时吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48412060/

相关文章:

debugging - 如何设置GDB在Windows中调试Rust程序?

c++ - 浮点错误 -1.#J 是什么意思?

.net - 在发布应用程序中包含 PDB 文件的优点和缺点

php - CRC 16 -DECT 与聚 x^16 + x^10 + x^8 + x^7 + x^3 + 1

eclipse - 在 Mac 上使用 Eclipse 进行 C++ 调试器

debugging - 调用堆栈窗口始终为空

c++ - 试图让 curl 在 c++ linux 和 GDB 中工作

c - 运行C程序时出现段错误

c - 如何将 argv[][] 与空格字符进行比较?

c - K&R C 中的数组是如何初始化的?