Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 本机崩溃调用堆栈中的地址和偏移量到底是什么?_Android_C++_Debugging_Crash - Fatal编程技术网

Android 本机崩溃调用堆栈中的地址和偏移量到底是什么?

Android 本机崩溃调用堆栈中的地址和偏移量到底是什么?,android,c++,debugging,crash,Android,C++,Debugging,Crash,每当我的android应用程序本机代码出现崩溃时,我都会使用NDK提供的addr2line工具将地址解析为源代码中的精确代码行。这些天来,我一直忽略调用堆栈中提供的其他信息,即偏移量。示例崩溃堆栈 08-16 07:44:47.328 1349 1349 F DEBUG : #00 pc 0000000000e52516 /data/data/com.syam.test/files/data/applibs/libnative.so (offset 0x1702000) 08

每当我的android应用程序本机代码出现崩溃时,我都会使用NDK提供的addr2line工具将地址解析为源代码中的精确代码行。这些天来,我一直忽略调用堆栈中提供的其他信息,即偏移量。示例崩溃堆栈

08-16 07:44:47.328  1349  1349 F DEBUG   :     #00 pc 0000000000e52516  /data/data/com.syam.test/files/data/applibs/libnative.so (offset 0x1702000)

08-16 07:44:47.328  1349  1349 F DEBUG   :     #01 pc 0000000000e5242b  /data/data/com.syam.test/files/data/applibs/libnative.so (offset 0x1702000)

08-16 07:44:47.328  1349  1349 F DEBUG   :     #02 pc 0000000000e5226d  /data/data/com.syam.test/files/data/applibs/libnative.so (offset 0x1702000)
在考虑这些偏移量的同时,我也开始明白,我也不知道这些地址在物理上对应的是什么


有人能告诉我这两个问题吗,地址和偏移量。偏移量是加载模块(即共享库)过程中的起始地址。因此,与进程本身相关的实际地址是
offset+address

这就是操作系统仅根据当时程序寄存器中的地址识别哪个模块崩溃的方法。请注意,至少还有另一层,因为进程本身在全局地址空间中有自己的偏移量,并且实际上可以被操作系统移动。但我离题了

由于库本身可能被加载到进程地址空间中的任何位置,因此除非开发人员也知道偏移量,否则它对开发人员没有用处。幸运的是,您可以减去偏移量,然后返回编译时确定的特定于库的地址。这就是
addr2line
的工作原理

换句话说,偏移量可以改变,但地址是固定的

所有这些的要点是,您不需要编译包含任何调试符号的二进制文件(因此其他人无法轻松了解您的程序是如何工作的)。但是,如果有人报告了崩溃,并且您至少拥有进程地址和库偏移量,您可以通过使用私有调试符号确定崩溃发生的位置


因此,如果您有
libnative.So
的符号和源代码,这些符号和源代码在程序崩溃时用于构建运行的版本,那么您可以使用完全相同的技术来了解发生这种情况的位置。如果幸运的话,该库可能包含一些基本的调试信息,如函数名。

谢谢!!有了你的回答,我理解了这个概念。。。人们可能需要经历这些才能真正获得好处。