addr2line -e 显示:0??
dmesg 显示如下
66666[27964]: segfault at 6a ip 00000000006d9c66 sp 00007fd0f2bf74b0 error 4 in 66666[400000+6ea000]
6[28118]: segfault at 6a ip 00000000006d9c66 sp 00007f608ebf74b0 error 4 in 6[400000+6ea000]
6666[31349]: segfault at 6a ip 00000000006d9c66 sp 00007fc8cd7f54b0 error 4 in 6666[400000+6ea000]
666[28386]: segfault at 6a ip 00000000006d9c66 sp 00007efe2159c4b0 error 4 in 666[400000+6ea000]
66[36668]: segfault at 6a ip 00000000006d9c66 sp 00007fde6ebf74b0 error 4 in 66[400000+6ea000]
没有源码. 只能找出出bug的诱因了
看看bug在什么情况下可以稳定复现,然后尽量避免这种情况出现 或者写个程序监控.
以前没错,现在有错,还是代码健壮性的问题,可能是游戏人数增加,数据量增加,网络压力变化等环境变化导致程序某些代码由于健壮考虑不足,防御性不够造成问题。不改代码估计很难解决。可以先从环境上分析考虑,看看问题点在哪。
没有源码的话确实是不太好分析。之前一直没有问题,那就想一想最近做了哪些改动,比如系统配置方面的或者环境方面的,可能会有一些思绪。
有可能是服务器的问题,之前我也遇到过程序莫名其妙报错退出的情况,也不是代码问题,换了台电脑重装系统(同一个版本的系统),就再没出过类似的问题,可以尝试换个电脑
没有源码的话,是没法修复的
光看这个也看不出问题,而且要修复也是对源码进行修复。
没有源代码,怎么谈修复啊
复现错误,找到出错的场景,能找到源码,修改源码最简单。找不到源码,试试内存补丁之类的方法,不过分析汇编语言,添加补丁这块确实需要很大精力去学习。
需要源代码的
1,先整个看门狗程序,服务崩溃后把程序自动拉起来;
2,收集分析最近和之前的环境差异在哪里。
可以先从环境上分析考虑,看看问题点在哪。你看上能否迁出关键性代码,形成一个demo
程序挂掉后,在终端通过指令
dmesg
#或者
dmesg | grep 你的程序名
在系统日志中查找到相关的信息。
随便写个例子:
a.out[2374]: segfault at 7f0ed0bfbf70 ip 00007f0edd646fe7 sp 00007f0ed3603978 error 4 a.out[7f0edd514000+1b6000]
at(位置),ip(instruction pointer 指令指针),sp(stack pointer 堆指针),后面跟的都是地址。
对这三个地址分别执行
addr2line -e a.out xxxxxxxx
这里的“xxxxxxxx”就是上面的“7f0ed……”,前面的0可以省略,三个地址都试一下。如果成功了,终端会打印出来这个地址对应的代码行(前面提到编译时要加-g)。
这里的“error 4”是什么意思?把它更换成二进制表示,就是:100。说明是用户态内存访问越界了
bit2:值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界
bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界
bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址
这条信息是由于用户态程序写操作访问越界造成的,结论的得出基于下面的理论:
bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界
bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界
bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址
参考如下链接试试https://blog.csdn.net/zz460833359/article/details/121208349
运行addr2line -e 段错误程序 00000000006d9c66 (并对给出的其他指令指针值重复)来查看错误发生的地方。
更好的做法是获得一个调试工具构建,并在调试器(比如gdb)下重新生成问题。
错误意味着什么?
以下是各领域的细分:
address(在at之后)——代码试图访问的内存位置(很可能6a是我们期望设置为有效值的指针的偏移量,但它却指向0)
IP-指令指针,即。执行此操作的代码存在于何处
Sp-堆栈指针
error—页面错误的错误代码;关于这在x86上的意义,请参阅下面的内容。
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/include/asm/trap_pf.h?h=v5.16#n5
如有帮助,请采纳,十分感谢!
看你的描述,重做系统应该可以解决你的问题,系统里面有一些运行库可能不小心卸载了,环境不对,重做系统应该可以
报错里面有??,感觉是字符串被篡改了吧,考虑是该游戏是否有补丁未打,存在漏洞,导致源代码被恶意改动了;同时考虑本地操作系统漏洞或中毒导致。
这个很有可能和你最近安装或者设置的环境变量有关系。
1-首先:在测试的角度来看,先确定问题重现场景(在那种情况下运行会出现这种问题,检查是偶现bug ,还是某一场景下的bug )
2-其次参考场景可以如下:
(1)不改变代码的情况下,确认是否游戏人数导致、Cpu 是否负载、网络情况
(2)在关闭游戏访问,独自一人运行,同样网络下是否能够浮现问题。
很多情况都会导致段错误,可以用gdb跟一下看看具体是什么问题。
这个问题很容易解决,是因为你的操作系统不是正版造成的,重装一下系统即可解决
建议用一个稳定版点的linux发行版本
先卸载这个游戏,打开杀毒软件杀毒,完成后,重装游戏,这是被黑了,一般都是老猿自己设置的bug,这游戏没给尾款。
简单一点,Linux服务器加配置,增加CPU 和内存; 十有八九就是用户量大把服务器顶爆了
遇事不决,关闭客户端,清理缓存,再打开
光看这个看不出问题出在哪里,要修复也是对源码进行修复。
可能是内存问题,参考下这位老哥的帖子:https://blog.csdn.net/qq_16481385/article/details/111869066
ip是指令地址,sp是堆栈指针地址,看你发的信息可知出错时的指令地址是相同的,都是00000000006d9c66,但是堆栈指针地址却是不同的,说明出错的地方应该是一个子程序(用C语言的说法叫函数),由不同的地方多次调用,你可以反汇编查看一下这个指令地址,查找原因。
解决方法
看你描述,原先没问题,后来突然出现的问题,可能是系统版本或者一些系统配置或者第三方库甚至驱动不经意升级导致的
1、安装个Linux虚拟机或另一台电脑,安装原先的系统版本
2、重装这个程序,跑一下试试
如果可以运行,那么就是你原先系统做了什么改动导致的,重装系统或者排查下这个新系统和原先系统的配置和版本
如果不可以运行,再来查找进一步的问题。
如有问题及时沟通
如原来运行无问题,后运行过程中出问题,不知道系统是否更新的话,在没有源码的情况下,还想继续用,最快捷的方式是重装下系统,然后再运行程序
😂😂朋友的源码不给出来咋修复哩
这种方法也是被大众所熟知并广泛采用的方法,首先我们需要一个带有调试信息的可执行程序,所以我们加上“-g -rdynamic"的参数进行编译,然后用gdb调试运行这个新编译的程序,具体步骤如下:
xiaosuo@gentux test $ gcc -g -rdynamic d.c
xiaosuo@gentux test $ gdb ./a.out
GNU gdb 6.5
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) r
Starting program: /home/xiaosuo/test/a.out
Program received signal SIGSEGV, Segmentation fault.
0x08048524 in dummy_function () at d.c:4
4 *ptr = 0x00;
(gdb)
可以考虑重置系统试试