我的可执行文件包含符号表 但似乎堆栈跟踪已被覆盖.
如何从该核心获取更多信息?例如,有没有办法检查堆?查看填充堆的对象实例以获取一些线索.无论如何,任何想法都值得赞赏.
我正在尝试编写一个可以解析核心转储文件的C程序.我的问题是,如何在C中获取导致核心转储的地址?我知道可以从这个答案中使用gdb获取地址:
但我想直接在C中检索地址.任何信息都将受到高度赞赏.谢谢!
注意:我知道如何将核心转储解析为精灵.但我不知道如何获得导致段错误的地址.
我正在使用NDK r5b在Android 2.3.x上进行开发.偶尔我的代码会崩溃,我想知道在哪里.当我有一个指针(即来自Android的堆栈跟踪)时,我已经知道如何在我的应用程序中获取相应的行.
但是,我经常看到像这样无用的堆栈跟踪(完整堆栈跟踪):
#00 pc 0006561a /system/lib/egl/libGLESv2_adreno200.so
#01 pc 0006b900 /system/lib/egl/libGLESv2_adreno200.so
#02 pc 0005aac8 /system/lib/egl/libGLESv2_adreno200.so
#03 pc 0001687a /system/lib/egl/libGLESv1_CM_adreno200.so
#04 pc 000096ce /system/lib/egl/libGLESv1_CM_adreno200.so
Run Code Online (Sandbox Code Playgroud)
或这个:
(gdb) bt
#0 0xafd0c51c in epoll_wait () from /Volumes/SecureCode/webos/rta/android/obj/local/armeabi/libc.so
#1 0xa81216a6 in ?? ()
Run Code Online (Sandbox Code Playgroud)
根本没有提到我的代码.
有没有办法获得比这更好的堆栈跟踪?为什么某些库函数"不透明",因为它们不允许回溯"透视"到调用函数,导致堆栈跟踪中的停止?
据我所知,调试这样的问题的唯一方法是在程序中的每个点使用日志记录和/或使用gdb逐步执行每一行.
是否有ROM可用于这些Android库的调试版本而不是运行时库,这会有帮助吗?(我只使用一部手机进行开发,所以我不担心保持全部功能.)(实际上,我注意到libc.so上面gdb堆栈跟踪的路径在我的应用程序目录中.我可能只是用不同的方式打包它(调试)libc.so,那会有帮助吗?)
最后一件事可能有所帮助:在logcat(第一个)的上述堆栈跟踪中,我的库在原始堆栈转储中被提及:
stack:
...
...
4471cb88 00000028
4471cb8c afd4649c
4471cb90 80b4eb71 /data/data/com.audia.dev.rta/lib/librta.so
4471cb94 00299180
...
...
Run Code Online (Sandbox Code Playgroud)
但那不是函数指针.可能是什么,在应用程序崩溃后会有任何帮助吗?我猜它可能不是,如果它是一个堆指针或类似的东西.
当我的c ++ linux应用程序崩溃时,我需要转储堆栈跟踪.我使用backtrace()和backtrace_symbols()成功地做到了这一点.现在,另外我想得到崩溃的行号.它是怎么做到的?
假设我有一个导致分段错误的代码.
char * ptr = NULL;
*ptr = "hello"; /* this will cause a segmentation fault */
Run Code Online (Sandbox Code Playgroud)
如何在运行时打印,内存中发生分段错误的地址,以及分段错误的原因(访问禁止的内存区域或其他内容).
我读到了关于核心转储文件,但我不确定它是否是正确的解决方案.
我怎样才能做到这一点?
PS,我知道我可以通过使用gdb或其他调试器实现这一点,但目的是通过使用代码和仅代码来实现.
我有一个程序,有时会从指针算术中发生段错误.我知道这种情况会发生,但是我不能提前检查它是否是段错误 - 要么我可以"预扫描"输入数据以查看它是否会导致段错误(这是无法确定的),或者我可以修改它不使用指针算法,这将需要大量的工作,或者我可以尝试捕获段错误.所以我的问题:
1)如何在C中捕获段错误?我知道操作系统中的某些内容会导致段错误,但是C程序可以做的事情是,如果它会比仅仅更优雅地使用段错误而死掉它们Segmentation fault?
2)这有多便携?
我想这是一个非常不可移植的行为,所以如果你发布任何代码来捕获段错误,请告诉我它的工作原理.我在Mac OS X上,但我希望我的程序可以在尽可能多的平台上工作,我想知道我的选择是什么.
并且不用担心 - 基本上我想要做的就是打印一个更加用户友好的错误消息并释放一些malloc()内存,然后死掉.我不打算只是忽略我得到的所有段错误并继续前进.
在Linux上分析崩溃的最佳方法是什么?
我们希望构建软件并向测试人员提供发布版本.测试人员可能无法记住如何重现崩溃或崩溃可能完全断断续续.他们的机器上也没有开发环境.该软件使用C/C++编写,并编译为本机代码以进行分发.
我对一个信号处理程序感兴趣,它可以识别导致问题的指令的地址.
我知道siginfo_t并且__builtin_return_address似乎都没有工作:
#include <iostream>
#include <signal.h>
void handler (int, siginfo_t *, void *);
int main ()
{
begin:
std :: cerr << &&begin << " ~ " << &&before << " ~ " << &&after << "\n";
struct sigaction s;
s .sa_flags = SA_SIGINFO;
sigemptyset (& s .sa_mask);
s .sa_sigaction = handler;
sigaction (SIGSEGV, &s, NULL);
int * i = NULL;
before:
*i = 0;
after:
std :: cout << "End.\n";
}
void handler (int, siginfo_t …Run Code Online (Sandbox Code Playgroud) C中有没有像python一样的库?
def myfunction():
import inspect
inspect.stack(): # this give you complete stack up to this function call
Run Code Online (Sandbox Code Playgroud)
调试python程序非常有用.
其实我想调试GTK Combobox小部件,了解完整的流程我需要完整的函数调用堆栈.
那么有什么类似的C语言技术库,比如python inspect package吗?