使用gdb进行调试时,程序遇到了奇怪的行为。下面提到的是我的程序从核心的回溯。当我从第4帧到第3帧(#4到#3)遍历程序时,我看到一种奇怪的行为。
(gdb) bt
#0 0xb76b5a29 in memset ()
#1 0xb786e916 in calloc (mem=429496, size=8)
#2 0xb788db57 in fetch_vals (bt_ptr=0x818776c, num_bt=135831740, txn=0xb24dd750)
#3 0xb788ffe2 in build_list (pol_id=0, txn=0xb24dd750)
#4 0xb788bc7f in request (fields=0xb5320c90, attrs=0x0)
#5 0xb789c214 in process_ipc (fd_info=0x80cff9c, msg=0xb5320c60, opq=0xb249bfd0)
#6 0xb77acd04 in process_recv (fd_info=0x80cff9c, arg=0x0, flags=0)
#7 0xb77a7385 in main (arg=0x8070db4)
#8 0xb76451e8 in __pthread_initialize ()
#9 0xb770172a in clone ()
传递给 build_list()方法的变量 pol_id 是 request()方法中定义的局部变量。我没有在调用或调用方法中的任何地方修改此变量。然而,在查看回溯时,我发现它的值有时会因为程序失败而被清除为0。如果我查看#3,其收到为0( build_list(pol_id = 0,txn = 0xb24dd750)),这是显而易见的。
下面提到的是堆栈第4帧的“info local”( request() ),我们可以看到 pol_id = 2的值
(gdb) f 4
#4 0xb788bc7f in request (fields=0xb5320c90, attrs=0x0)
274 req = build_list(pol_id, &txn);
(gdb) info local
req = (request *) 0x1
resp = (response *) 0x0
txn = {pol_set_id = 2, flags = 0, fields = 0xb5320c90}
pol_id = 2
__FUNCTION__ = "request"
(gdb)
任何人都可以请指出为什么会发生这种情况?我检查了我的程序,并没有修改pol_id变量。
感谢。