Debugging RPC客户端在SEGV';s在0x8地址上

Debugging RPC客户端在SEGV';s在0x8地址上,debugging,rpc,segmentation-fault,Debugging,Rpc,Segmentation Fault,需要一些选项来排除这种情况。下面是我所做的一些工作,我无法确定如何在0x8地址上获得SIGSEGV。没有推荐人有那个地址。因为这是由rpcgen生成的,而且看起来是正确的,所以我不知道下一步该怎么看。(RHEL 7.2、x86、gcc 4.8.5) 谢谢你的选择 GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-80.el7 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+:

需要一些选项来排除这种情况。下面是我所做的一些工作,我无法确定如何在0x8地址上获得SIGSEGV。没有推荐人有那个地址。因为这是由rpcgen生成的,而且看起来是正确的,所以我不知道下一步该怎么看。(RHEL 7.2、x86、gcc 4.8.5)

谢谢你的选择

GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-80.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Êype "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/tdavis/deepspace/RL/rl/rl/dsvwrite...done.
[New LWP 19338]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Core was generated by `dsvwrite if=/root/anaconda-ks.cfg
fid=anaconda-ks.cfg'.
Program terminated with signal 11, Segmentation fault.
#0 0x000000000048fb0d in lt_open_1 (argp=0x7ffdafed6f40, clnt=0x0) at ds_clnt.c:93
93          memset((char *)&clnt_res, 0, sizeof(clnt_res));
(gdb) bt
#0 0x000000000048fb0d in lt_open_1 (argp=0x7ffdafed6f40, clnt=0x0) at ds_clnt.c:93
#1 0x00000000004552e2 in ltr_open (lt=0xd003a0, lbl=0x7ffdafed71d0, mode=2, p_start=0) at ds_lib.c:373
#2 0x0000000000441501 in lt_open (lt=0xd003a0, lbl=0x7ffdafed71d0, mode=2, p_start=0) at lt.c:383
#3 0x000000000042fa9d in vs_xopen (vsd=0, oflg=2, fs=0x7ffdafed7460) at rx.c:870
#4 0x000000000042ce55 in vs_open (vsd=0, oflg=2, fs=0x7ffdafed76f0) at rx.c:349
#5 0x000000000040b30c in rlvwrite (argc=3, argv=0x7ffdafed7a38) at xcom.c:685
#6 0x00000000004983c5 in main_mux (argc=3, argv=0x7ffdafed7a38) at main_man.c:87
#7 0x0000000000404881 in main (argc=3, argv=0x7ffdafed7a38) at rcom.c:376
(gdb) l
88  open_res *
89  lt_open_1(open_prm *argp, CLIENT *clnt)
90  {
91          static open_res clnt_res;
92
93          memset((char *)&clnt_res, 0, sizeof(clnt_res));
94          if (clnt_call (clnt, LT_OPEN,
95                  (xdrproc_t) xdr_open_prm, (caddr_t) argp,
96                  (xdrproc_t) xdr_open_res, (caddr_t) &clnt_res,
97                  TIMEOUT) != RPC_SUCCESS) {
(gdb)98                    return (NULL);
99          }
100         return (&clnt_res);
101 }
102
103 close_res *
104 lt_close_1(close_prm *argp, CLIENT *clnt)
105 {   106         static close_res clnt_res;
107
(gdb) p clnt_res
$1 = {lbl = {tran = 0, pad = 0, len = 0, format = 0, vol = 0x0, uvol = 0x0, file = 0x0,Êfile = 0x0, unl = 0x0}, status = 0, terrn = 0, uerrno = 0, rl_system = 0,Êl_assert = 0}
(gdb) p $_siginfo
$2 = {si_signo = 11, si_errno = 0, si_code = 1, _sifields = {_pad = {8,Ê <repeats 27 times>}, _kill = {si_pid = 8, si_uid = 0}, _imer = {si_tid = 8,Êi_overrun = 0, si_sigval = {sival_int = 0, sival_ptr = 0x0}}, _rt = {si_pid = 8,Êi_uid = 0, si_sigval = {sival_i = 0, sival_ptr = 0x0}}, _sigchld = { si_pid = 8, si_uid = 0, si_status = 0, si_utime = 0, si_stime = 0}, **sigfault = { si_addr = 0x8}**, _sigpoll = {si_band = 8, si_fd = 0}}}
(gdb) quit
GNU gdb(gdb)Red Hat Enterprise Linux 7.6.1-80.el7
版权所有(C)2013免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。√ätype“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“x86_64-redhat-linux-gnu”。
有关错误报告说明,请参阅:
...
从/home/tdavis/deepspace/RL/RL/RL/dsvwrite读取符号…完成。
[新LWP 19338]
[已启用使用libthread_db的线程调试]
使用主机libthread_db library“/lib64/libthread_db.so.1”。
Core由`dsvwrite if=/root/anaconda-ks.cfg生成
fid=巨蟒ks.cfg'。
程序以信号11终止,分段故障。
#0 0x000000000048fb0d位于ds_clnt.c:93的lt_open_1(argp=0x7ffdafed6f40,clnt=0x0)中
93个内存集((char*)和clnt_res,0,sizeof(clnt_res));
(gdb)英国电信
#0 0x000000000048fb0d位于ds_clnt.c:93的lt_open_1(argp=0x7ffdafed6f40,clnt=0x0)中
#1 0x00000000004552e2在ds_库c处ltr_打开(lt=0xd003a0,lbl=0x7ffdafed71d0,模式=2,p_启动=0):373
#在lt.c:383处,2 0x0000000000441501处于lt_打开状态(lt=0xd003a0,lbl=0x7ffdafed71d0,模式=2,p_启动=0)
#在rx.c:870处,3 0x000000000042fa9d在vs_xopen(vsd=0,oflg=2,fs=0x7ffdafed7460)中
#4 0x000000000042ce55在rx处处于vs_打开状态(vsd=0,oflg=2,fs=0x7ffdafed76f0)。c:349
#在xcom.c:685处的rlvwrite(argc=3,argv=0x7ffdafed7a38)中的5 0x000000000040b30c
#主接线盒处主接线盒中的6 0x00000000004983c5(argc=3,argv=0x7ffdafed7a38)。c:87
#rcom处的7 0x0000000000404881主(argc=3,argv=0x7ffdafed7a38)。c:376
(gdb)l
88公开课*
89 lt_open_1(open_prm*argp,CLIENT*clnt)
90  {
91静态打开/关闭/关闭;
92
93个内存集((char*)和clnt_res,0,sizeof(clnt_res));
94如果(clnt)呼叫(clnt,LT\U打开,
95(xdrproc_t)xdr_open_prm,(caddr_t)argp,
96(xdrproc_t)xdr_open_res,(caddr_t)和clnt_res,
97超时)!=RPC_成功){
(gdb)98返回(空);
99          }
100份申报表(及申报表);
101 }
102
103关闭*
104 lt_close_1(close_prm*argp,CLIENT*clnt)
105{106静态关闭(clnt)res;
107
(gdb)p clnt_res
$1={lbl={tran=0,pad=0,len=0,format=0,vol=0x0,uvol=0x0,file=0x0,Êfile=0x0,unl=0x0},status=0,terrn=0,uerrno=0,rl_system=0,Êl_assert=0}
(gdb)p$\u siginfo
$2={si_signo=11,si_errno=0,si_code=1,{u sifields={u pad={8,Ê},_kill={si_pid=8,si_uid=0},_imer={si_tid=8,Êi_over=0,si_sigval={sival_int=0,sival_ptr=0x0},_rt={si_pid=8,Êi_uid=0,si_sigval={sival_i=0,sival_ptr=0x0},_sigchld={si_pid=8,si_uid=0,si_status=0,si_utime=0,si_stime=0},**sigfault={si_addr=0x8}**,_sigpoll={si_band=8,si_fd 0}
(gdb)退出

valgrind确认地址,但当进入clnt_调用或memset时,它将SEGV。捕获SEGV不提供任何帮助。始终在$_siginfo的si_地址中使用0x8==32495==大小为8==32495==无效读取0x48FB21:lt_open_1(ds_clnt.c:94)==32495==由0x4552E1:ltr_open(ds_lib.c:387;)==32495==0x42CE54:vs_open(rx.c:349)==32495==0x40B30B:rlvwrite(xcom.c:685)==32495==0x4983D8:main_mux(main_man.c:87)==0x404880:main(rcom.c:376)==32495==地址0x8不是堆栈、malloc或(最近)free'dProblem solved。除了解决愚蠢的用户场景外,仍然不确定如何调试此类问题。问题是由于一个错误的“;”而出现的。如果gdb提供了一些线索,那就太好了。最终,在看到逻辑变化之前,我不得不第1000次阅读代码路径。我想我应该进行更新,以便e不要再浪费带宽。valgrind确认地址,但当进入clnt_调用或memset时,它将SEGV。陷阱SEGV不提供任何帮助。始终在$siginfo的si_地址中使用0x8==32495==大小为8的无效读取==32495==在0x48FB21:lt_open_1(ds_clnt.c:94)==32495==由0x4552E1:ltr_open(ds_lib.c:387;)==32495==0x42CE54:vs_open(rx.c:349)==32495==0x40B30B:rlvwrite(xcom.c:685)==32495==0x4983D8:main_mux(main_man.c:87)==0x404880:main(rcom.c:376)==32495==地址0x8不是堆栈、malloc或(最近)free'dProblem solved。除了解决愚蠢的用户场景外,仍然不确定如何调试此类问题。问题是由于一个错误的“;”而出现的。如果gdb提供了一些线索,那就太好了。最终,在看到逻辑变化之前,我不得不第1000次阅读代码路径。我想我应该进行更新,以便不要再浪费带宽了。