如何使用GDB正确打印内置类型time_t的变量值
GDB打印time_t类型变量异常解决方法
你打印结果不符合预期的核心原因是变量还未完成初始化:
你执行n指令后跳转到了time_t dataFrom = 1234560;这一行,此时该行代码尚未执行,dataFrom存储的是栈内存的随机垃圾值,所以输出结果和你设置的初始值完全不符。
正确操作步骤
- 完成变量初始化:在跳转到赋值行后,再执行一次
n指令,等赋值语句执行完成后再打印变量 - 打印time_t原始数值:time_t是标准库定义的算术类型,在绝大多数64位系统上是
long int的别名,不需要额外给GDB提供结构定义,直接执行p dataFrom或者p (long)dataFrom即可输出正确的数值 - 打印人类可读的时间格式:可以直接调用C标准库函数输出格式化时间,执行
call ctime(&dataFrom)即可得到和代码中asctime(gmtime(&dataFrom))类似的可读时间结果
操作示例
(gdb) n 10 time_t dataFrom = 1234560; (gdb) n # 执行赋值语句完成初始化 11 cout << "dataFrom = " << asctime(gmtime(&dataFrom)) << "\n"; (gdb) p dataFrom $1 = 1234560 (gdb) call ctime(&dataFrom) $2 = 0x5555557562a0 "Thu Jan 15 14:56:00 1970\n"
注意事项
time_t本身不是指针类型,你之前执行p *dataFrom能得到结果是因为未初始化的垃圾值刚好被识别为内存地址,属于未定义行为,变量初始化完成后执行该指令会触发GDB报错。
内容的提问来源于stack exchange,提问作者badri
相关产品推荐
相关产品推荐

