sho*_*osh 12 debugging android symbols lldb
我正在尝试使用lldb从Android Studio的本机调试中调试Android本机应用程序.
我的原生应用程序包含一个由Android Studio编译和运行的libmain.so以及由我编译的另一个外部libother.so.在调试时,我能够在libmain.so中设置断点,但不能在libother.so中设置断点.
两个共享对象都被剥离,但不知何故,Android Studio使lldb知道libmain.so的未剥离版本.我想为libother.so做同样的事情.
我需要使用什么命令来lldb,以便从本地计算机上的未提取文件中加载符号?
当我这样做时,image list我看到主要的.so带有指向其本地未剥离版本的路径:
/Users/username/Projects/gow/android/AppName/app/build/intermediates/binaries/debug/arm7/obj/armeabi-v7a/libmain.so
第二个.so的路径就像
/var/folders/3w/5nr95lxx3qvdm2ylb8c8b7500000gn/T/./lldb/module_cache/remote-android/.cache/B5F32653-0000-0000-0000-000000000000/libother.so
如何让lldb找到未剥离的版本libother.so?
我尝试过image add,target symbols add但它没有用.
此线程中的答案似乎特定于 MacOSX。我使用的是 Linux,所以这些答案不是很有帮助。一段时间后,我想通了,这是一个非常简单的解决方案。在执行“进程附加”之前,您应该执行以下命令:
settings set target.exec-search-paths /path/to/directory/with/unstripped/library/on/host
Run Code Online (Sandbox Code Playgroud)
使用此设置 lldb 可以轻松找到正确版本的库。
顺便说一句,最新版本的 Android Studio 对外部库没有任何问题(实际上,相同的技术用于设置所有库的正确路径,包括“内部”和“外部”,至少如果您使用 Gradle 构建)。但是如果你使用独立的 lldb,这会非常方便。
为了避免在每个调试会话开始后输入它,您可以将此命令保存到文件(例如lldb.cmd),然后像这样启动 lldb:
./lldb -S lldb.cmd
Run Code Online (Sandbox Code Playgroud)
使用“target.source-map”设置
(lldb) 设置列表 target.source-map
source-map -- 源路径重新映射,用于跟踪构建时的源文件与其在当前系统上的存在位置之间的位置更改。它由一个双元组组成,每个双元组的第一个元素是构建文件时文件路径的某些部分(从根开始),第二个元素是原始构建层次结构的其余部分的根目录本地系统。按顺序检查数组的每个元素,第一个匹配的元素获胜。
IE
settings set target.source-map /build_src /source
Run Code Online (Sandbox Code Playgroud)
构建环境所在的位置/build_src,.dSYM 文件(符号)复制到下面/source
编辑:
二进制文件在构建并打包到发行版后通常会被剥离。如果您的构建系统保存了未剥离的可执行文件,则可以使用键DBGSymbolRichExecutable提供该可执行文件的路径
您可以编写一个 shell 命令,该命令将被赋予一个 UUID 值,并期望返回一个 plist,其中包含指定二进制文件位置的某些键。
您可以使用以下命令启用 shell 脚本:
% defaults write com.apple.DebugSymbols DBGShellCommands /path/to/shellscript
Run Code Online (Sandbox Code Playgroud)
您的 shell 脚本将使用 UUID 字符串值(例如“23516BE4-29BE-350C-91C9-F36E7999F0F1”)来调用。shell 脚本可以使用以下格式的 plist 进行响应:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd";>
<plist version="1.0">
<dict>
<key>23516BE4-29BE-350C-91C9-F36E7999F0F1</key>
<dict>
<key>DBGArchitecture</key>
<string>i386</string>
<key>DBGBuildSourcePath</key>
<string>/path/to/build/sources</string>
<key>DBGSourcePath</key>
<string>/path/to/actual/sources</string>
<key>DBGDSYMPath</key>
<string>/path/to/foo.dSYM/Contents/Resources/DWARF/foo</string>
<key>DBGSymbolRichExecutable</key>
<string>/path/to/unstripped/exectuable</string>
</dict>
<key>A40597AA-5529-3337-8C09-D8A014EB1578</key>
<dict>
<key>DBGArchitecture</key>
<string>x86_64</string>
.....
</dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
更多详情请参阅:
http://lldb.llvm.org/symbols.html
https://www.mail-archive.com/lldb-dev@cs.uiuc.edu/msg01142.html
编辑2:
用于打印可执行文件的构建 UUID 的终端命令
$ xcrun dwarfdump --uuid <PATH_TO_APP_EXECUTABLE>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8722 次 |
| 最近记录: |