免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6400 | 回复: 10

[C++] GDB调试时行号显示错位 [复制链接]

论坛徽章:
0
发表于 2016-01-28 09:32 |显示全部楼层
GDB调试的时候实际执行的语句和GDB打印出来的语句不一致,请高手指点一下原因

[back@DevXY01 bin]$ gdb ./bpostsupply -d ../qs_qscl/ -d ../qs_qslib/
GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-45.el5)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:

Reading symbols from /home/back/batch/bin/bpostsupply...done.
(gdb) b IPOLot
Breakpoint 1 at 0x8139979: file ipopost.cpp, line 85.
(gdb) r
Starting program: /home/back/batch/bin/bpostsupply
[Thread debugging using libthread_db enabled]
[DBS][USERNAME][back]
[DBS][PASSWORD][76c959f0d40336b4]
[DBS][DBNAME][ksdbs]
[DBS][SERVER][test]
[CLR_PROCESS_CONTROL][CLR_PROCESS_CONTROL][0]

Breakpoint 1, IPOLot (pPostDate=0xffffd72b "20160126", pMsg=0xffffccb4 "") at ipopost.cpp:85
85          double  dMaxWithdraw        = 0;    
(gdb) list
80          int     iErrCode            = 0;
81          long    lSerialNo           = 0;
82          double  dLotAmtSum          = 0;   
83          double  dCustAmtSum         = 0;   
84          double  dDoneAmtSum         = 0;   
85          double  dMaxWithdraw        = 0;   
86          double  dDoneAmt            = 0;   
87          char    sErrCode[10]        = {0};
88          char    sMsg[256]           = {0};
89          char    sRealSerial[13]     = {0};
(gdb)
90         
91          ST_IPO_TOTAL    struipo_total_in    = {0};
92          ST_IPO_TOTAL    struipo_total_out   = {0};
93          LPIPO_TOTAL     point               = (LPIPO_TOTAL)NULL;
94          fund_stk_chg_fc rt                  = {0};
95          fund_stk_chg_fc stAmendFc           = {0};
96          ST_CUSTFUNDINFO strucust_fund_info  = {0};
97         
98          iPostDate   = atoi(pPostDate);
99
(gdb)
100         strcpy(struipo_total_in.scust_no, g_postfund.sCustNo);
101         struipo_total_in.isettle_date   = iPostDate;
102
103         /*
104          *
105          */   
106         if (FALSE == g_cipo_total.Sum(&struipo_total_in, &dLotAmtSum, &dCustAmtSum, pMsg))
107         {
108             if (strcmp(pMsg, "") == 0)
109             {
(gdb) n
86          double  dDoneAmt            = 0;
(gdb)
87          char    sErrCode[10]        = {0};
(gdb)
程序本来是从第80行开始执行的,但是单步调试时GDB显示执行的代码是第85 行 的代码;
已经试过 cleanall 重编译,不管用;而且也不是 换行符的问题,代码里面没有 ^M 的。
请问怎样才能解决这个问题啊?求高手解答

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2016-01-28 09:48 |显示全部楼层
编译的时候-O0试试,加了优化选项之后,执行是按照优化后来执行的,自然跟行号对不上

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
发表于 2016-01-28 10:13 |显示全部楼层
楼上正解,优化之后就有可能对不上。还可能跳来跳去。

论坛徽章:
0
发表于 2016-01-28 13:35 |显示全部楼层
谢谢楼上,但是这个-O0编译选项也试过了,没有作用的

论坛徽章:
16
天秤座
日期:2014-08-17 11:27:4215-16赛季CBA联赛之青岛
日期:2017-02-27 17:06:3015-16赛季CBA联赛之广夏
日期:2017-02-08 13:34:58白银圣斗士
日期:2015-11-30 20:57:05冥斗士
日期:2015-12-01 09:49:10嗜杀者
日期:2015-12-01 09:49:10白银圣斗士
日期:2015-11-27 23:56:51神斗士
日期:2015-12-01 09:49:10嗜杀者
日期:2015-12-01 09:49:10青铜圣斗士
日期:2015-12-01 09:49:10白银圣斗士
日期:2015-11-25 14:19:53黄金圣斗士
日期:2015-11-24 10:43:13
发表于 2016-01-29 19:06 |显示全部楼层
本帖最后由 Jean_Leo 于 2016-01-29 19:07 编辑

加上-g3试试吧,同时去掉所有-O选项,另外有可能是实际编译的代码不一致

论坛徽章:
0
发表于 2016-02-01 13:30 |显示全部楼层
目前我用的调试级别是 -g2;代码是嵌入式SQL写的,所以先用的 db2 prep 编译,而后再用 gcc 进行的编译
[back@DevXY01 make]$ make -B -n | grep ipopost
db2 prep /home/back/batch/qs_qscl/ipopost.cpp target cplusplus bindfile using /home/back/batch/qs_qscl/ipopost.bnd package using ipopost output /home/back/batch/qs_qscl/c/ipopost.cpp
db2 bind /home/back/batch/qs_qscl/ipopost.bnd
db2 grant execute on package ipopost to public
gcc -m32 -I/home/db2inst1/sqllib/include -I/home/back/batch/qs_qslib -I/home/back/batch/qs_qscl -c -g2 -D_GCC_ -O0 -fPIC -o /home/back/batch/qs_qscl/obj/ipopost.o /home/back/batch/qs_qscl/c/ipopost.cpp
gcc -m32 -lstdc++ -lm -L/home/db2inst1/sqllib/lib -ldb2 -O0 -L/home/back/batch/libs -lqslib -o /home/back/batch/bin/bpost  /home/back/batch/qs_qscl/obj/ipopost.o /home/back/batch/qs_qscl/obj/ipo_total.o /home/back/batch/qs_qscl/obj/bpost.o /home/back/batch/qs_qscl/obj/bsglpost.o /home/back/batch/qs_qscl/obj/business.o

论坛徽章:
0
发表于 2016-02-01 13:34 |显示全部楼层
而用GDB调试的时候我们都是用的最原始的代码文件,没有经过 db2 prep 的代码文件;只是比较奇怪的是有的代码调试时行号是对的,有的就不对

论坛徽章:
0
发表于 2016-02-29 19:37 |显示全部楼层
终于发现问题的原因了
文件有如下代码:
#ifdef _X86_
EXEC SQL INCLUDE SQLCA;
#else
#include <sqlda.h>
#include <sqlca.h>
extern struct sqlca sqlca;
#endif
但是 _X86_ 宏是没有定义的,所以 gcc 的预编译不会走到 EXEC SQL INCLUDE SQLCA;
而 db2 的 prep 发生在 gcc 的预编译之前,所以 EXEC SQL INCLUDE SQLCA; 会被替换
#ifdef _X86_

/*
EXEC SQL INCLUDE SQLCA;
*/

/* SQL Communication Area - SQLCA - structures and constants */
#include "sqlca.h"
struct sqlca sqlca;


#line 59 "ipopost.cpp"

#else
#include <sqlda.h>
#include <sqlca.h>
extern struct sqlca sqlca;
#endif

经过这么一替换,编译出来的调试信息行号就不对了

论坛徽章:
0
发表于 2016-02-29 19:42 |显示全部楼层
解决问题的思路,就是把代码不断简化,例如让函数直接 return、去掉全局变量定义、去掉所包含的头文件等等,代码经过简化之后再编译,再看看代码调试信息是否准确。最后确定是 EXEC SQL INCLUDE SQLCA; 这句的问题,不加这句代码编译之后的调试信息都是准确的。

论坛徽章:
0
发表于 2016-02-29 19:46 |显示全部楼层
我用的是 addr2line 工具结合 nm 工具,查看 *.o 文件的调试信息是否准确的
[back@vmlinux_5 obj]$ nm ipopost.o | grep IPOLot     
0000000000000000 T _Z14RollBackIPOLotPcS_
0000000000000250 T _Z6IPOLotPcS_
0000000000000290 r _ZZ6IPOLotPcS_E12__FUNCTION__
[back@vmlinux_5 obj]$
[back@vmlinux_5 obj]$
[back@vmlinux_5 obj]$ addr2line -e ipopost.o 0x250 -f
_Z6IPOLotPcS_
/home/back1/batch/make/ipopost.cpp:83
[back1@vmlinux_5 obj]$

然后再看看 ipopost.cpp 中的第 83 行是否是 IPOLot 函数的第一行
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP