Native 调试总结

  • debug so 才可以调试,release so 不可以调试。
  • 还原堆栈需要 /build/intermediates/cmake目录下的 so 才可以
  • 使用 sdk 工程调试另外一个 app 时需要修改 sdk工程中的 app 模块的包名和调试的 apk 一致。
  • 通过 dlopen() 的 so,默认不执行 jni_onload,只有 java层的 system.loadlibrary()才会执行。想要执行 jni_onload 执行 so 库初始化,需要手动调用 java 层的加载机制。
  • dlsym()函数获取符号地址时,要保证 so 的符号被导出。可以通过 nm -D xx.so 命令查看是否有对应的符号
阅读全文 »

如何为一个 sh 脚本创建 mac 应用程序?

创建捆绑包目录结构: 在 Finder 中,创建一个新的文件夹来作为应用程序捆绑包的根目录,并以 .app 扩展名命名,例如 MyShellApp.app

创建 Contents 目录: 在 MyShellApp.app 目录内部,创建一个名为 Contents 的子目录。

创建 MacOS 目录: 在 Contents 目录内部,创建一个名为 MacOS 的子目录。这是可执行文件的存放位置。

创建 Info.plist 文件: 在 Contents 目录中创建一个名为 Info.plist 的属性列表文件。这个文件包含了应用程序的元数据。以下是一个基本的 Info.plist 示例:

阅读全文 »

mmap

在 Linux 中,”mmap” 通常指的是内存映射(Memory-Mapped)机制。mmap 是一个系统调用,它允许应用程序将文件或设备的内容映射到进程的地址空间。这样,文件或设备的内容就可以像访问普通内存一样进行读写操作,而无需使用传统的文件读写系统调用(如 read()write())。

mmap 机制的本质是提供一种高效的文件访问方式,通过以下几个方面实现:

  1. 直接内存访问
    通过将文件内容映射到进程的虚拟内存,应用程序可以直接通过内存地址访问文件数据,这避免了传统文件 I/O 调用中的数据复制步骤。

  2. 延迟加载
    mmap 创建的内存映射是按需加载的,这意味着文件的内容只有在实际访问时才会被加载到物理内存中。这可以提高对大文件的处理效率,并减少内存的使用。

  3. 共享内存
    mmap 可以用于创建共享内存区域,允许多个进程访问同一块内存。这是进程间通信(IPC)的一种方式,也可以用于共享文件的内容。

  4. 页缓存(Page Cache)
    使用 mmap 映射的文件数据会被操作系统的页缓存管理,这意味着频繁访问的数据可以保留在缓存中,从而加快访问速度。同时,对映射内存的修改可以延迟写回到文件,直到必要时才进行,这可以减少磁盘 I/O 操作。

  5. 虚拟内存管理
    mmap 依赖于操作系统的虚拟内存管理机制。当进程访问映射的内存区域时,如果对应的数据尚未加载到物理内存,操作系统会自动处理缺页中断(page fault),将数据从磁盘加载到内存中。

mmap 系统调用通常用于需要高效文件访问的场景,如数据库管理系统、文件编辑器、多媒体应用程序等。它也是实现内存映射文件和匿名映射(不与任何文件关联的内存区域)的基础。

总的来说,mmap 机制的本质是通过将文件或设备内容映射到虚拟内存,提供一种高效、灵活的内存访问和文件操作方式,同时充分利用操作系统的虚拟内存和页缓存功能。

阅读全文 »

readelf

readelf 是一个用于显示 ELF(Executable and Linkable Format)文件信息的命令行工具,它是 GNU Binutils 包的一部分。ELF 文件格式是在 Unix 系统上广泛使用的标准二进制格式,用于可执行文件、目标代码、共享库和核心转储(core dumps)。

以下是 readelf 的一些核心用法:

查看文件头信息(File Header)

1
readelf -h <ELF file>

这个命令显示 ELF 文件的文件头信息,包括 ELF 类型(如可执行文件、共享对象等)、入口点地址、程序头表位置、段头表位置等。

查看程序头表(Program Headers)

1
readelf -l <ELF file>

程序头表描述了文件在内存中的映射。这个命令显示了每个段的信息,如类型(如 LOADDYNAMIC 等)、偏移、虚拟地址、物理地址、文件大小和内存大小等。

查看段头表(Section Headers)

1
readelf -S <ELF file>

段头表包含了文件中所有段的信息。这个命令显示了每个段的名称、类型、地址、偏移、大小、链接信息、对齐和其他属性。

查看符号表(Symbol Table)

1
readelf -s <ELF file>

符号表包含了文件中的符号信息,如函数和变量名。这个命令显示了每个符号的名称、类型、大小、值(地址)和绑定信息。

阅读全文 »
0%