-
Notifications
You must be signed in to change notification settings - Fork 4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
在brpc接口内部core,但是使用gdb分析时遇到问题 #165
Comments
我用下面会引起core的代码试验了下:
会给出业务代码的位置。像stof这种throw std::invalid_argument异常的情况我在非brpc环境下也试验了一下。是可以正常提示具体core位置的。 |
你可以跑下asan |
asan是内存监测工具,您的意思是stof这种,因为传入字符串导致的core,能监测出来? 我先用下试试 |
如果你不知道为什么core,asan是帮助找出可能有内存问题的地方。如果你知道那句话铁定crash,但coredump显示位置不准,一般是开了优化的关系。 |
我在下面的函数中,在
所以,可能是编译brpc的时候,增加了优化项?
我尝试将 -O2 去掉,重新编译实验下 |
不是O2的问题,增加-g,brpc内部函数调用的堆栈信息已经打印出来,可以调试。 不过brpc接口内部的业务代码 throw exception,导致服务core掉,这个core文件,bt后丢掉了业务代码的堆栈。这个问题是什么原因那? |
O2会影响bt的准确度 |
我去掉了O2,但是rpc接口内部的函数调用栈确实是没有体现在core文件当中。这个事是为啥呢? |
这是不可能的,说明没有去全。 |
只有下面的堆栈信息:
如果是我自己非rpc服务,throw exception导致的core,core文件会明确指出哪里出问题 |
brpc怎么修改Makefile,才能保证业务内部堆栈的输出呢? |
我也构造了segmentfault类型的错误在rpc的接口中,类似我之前说的:
这种报错,在core文件中,是有明确体现的,能直接定位问题的位置 |
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. 由于最近缺乏更新,这个issue已被自动标记为过期。如果接下来几天仍没有更新,它将会被关闭。感谢你的贡献。 |
我这里有类似的问题, 只不过是我自己实现的thrift协议的时候, 如果上游传来的协议数据有问题, server在解析失败的情况下会抛异常, 现场和这几基本一样. |
基于brpc构建的应用程序,每个请求是一个bthread,bthread调用的应用程序的方法 throw exception,并且没有catch,导致exception被抛出,在栈回退的时候会包含brpc的各种对象析构,我推测可能是brpc在这块没有处理好。 |
@adanteng 遇到了和你一样的问题,call stack也是一样的,实际都是在业务层导致的crash |
google和baidu的代码规范都不允许使用异常,所以用户callback里抛出异常默认是不支持的。后面在thrift中由于抛异常是常态,所以做了特殊支持。 |
@jamesge 我同意尽量不适用异常,但是在使用第三方库的时候,难免会有未捕获的异常,这种情况下coredump应该体现导致crash的具体位置。不知道brpc是做了什么处理吗? 另,“用户callback里抛出异常默认是不支持的”是什么意思? |
我也遇到类似的问题,跟了一下gcc5.2源码 麻烦 @jamesge 看下,谢谢! |
执行到brpc内部挂掉: 业务执行map.at,抛异常,栈回退的过程完全正常,本来应该在_Unwind_RaiseException_Phase2这个函数中执行fs.personality就会挂掉,但是这个指针为NULL (gdb) bt |
我也遇到了这个问题, bt也是展示了core在brpc里, 所以应该怎么看到core在我业务代码的backtrace上 |
我的做法是在回调内写一个大的try catch,这样可以捕获,避免brpc“吞掉”异常。 |
@scottzzq 请教一下你的后面一个与业务逻辑相关的backtrace是如何打出来的 |
@d0ngjun 可以在brpc回调的函数都加上noexcept, 然后core的时候backtrace就会出来 |
很明显是出现了未捕获的异常,下次遇到这种core栈,给自己的业务代码多加noexcept来缩小排查范围 |
brpc问题太多了,名不副实啊 |
#2256 应该已经修复了这个问题了 |
在brpc接口内部使用该方法,导致服务core。通过分析core有办法能直接定位到哪一行出现的问题吗?
使用gdb打开core文件,bt后得到下面的信息:


The text was updated successfully, but these errors were encountered: