webrtc-tutorial
webrtc-tutorial copied to clipboard
basic/webrtc-breakpoint/ - 断点调试 - WebRTC 学习指南
请问下这里有办法语法高亮c++代码吗
请问下这里有办法语法高亮c++代码吗
@tyrionchen 可以呀,代码高亮用的是 https://prismjs.com/#examples ,默认 C 系列语言的高亮都支持的。
是说在Android Studio里面单步C++代码的时候高亮,这个可以么?
是说在Android Studio里面单步C++代码的时候高亮,这个可以么?
@tyrionchen 这个截图里,当前单步的行就是高亮蓝色;如果单步到下一行,下一行就是高亮蓝色。
是说c++的代码语法高亮 比如这个类名PeerConnection和方法名createOffer,现在是白的,应该点击也不能跳转
是说c++的代码语法高亮 比如这个类名PeerConnection和方法名createOffer,现在是白的,应该点击也不能跳转
@tyrionchen 额,那确实不可以。一般查看或者修改 WebRTC 代码的话,还是在 VS Code 里;Android Studio 只是用来断点调试的。
明白了,感谢解答~
你好,我在单步调试native代码的时候调试器并不能正确地跳转到下一步,比如一段顺序执行的代码,断点打在第417行,执行下一步时高亮的不是第418行的代码,而是450行的代码,再执行几次下一步之后又会跳转到444行,请问这是怎么回事呢?是编译优化的问题吗?
你好,我在单步调试native代码的时候调试器并不能正确地跳转到下一步,比如一段顺序执行的代码,断点打在第417行,执行下一步时高亮的不是第418行的代码,而是450行的代码,再执行几次下一步之后又会跳转到444行,请问这是怎么回事呢?是编译优化的问题吗?
@CaoFang98 可以说下具体是哪个文件(或者哪个类)的 417 行嘛?我这边也打个断点看看。
在 src/third_party/libvpx/source/libvpx/vp9/vp9_dx_iface.c
文件的 init_decoder
函数上,我修改了这个文件,原文件中这个函数大概在254行。谢谢!
在
src/third_party/libvpx/source/libvpx/vp9/vp9_dx_iface.c
文件的init_decoder
函数上,我修改了这个文件,原文件中这个函数大概在254行。谢谢!
@CaoFang98 我这边的项目用的不是 VP9 编码器,所以没法断点了。
但是我大概浏览了一下这个文件,在 init_decoder
打断点应该不会出现你说的跳来跳去的问题。所以我怀疑可能有两种原因:
- 你的二进制文件的符号表和你打断点的文件的映射出错了,所以单步的时候调试器根据符号表还原到文件上就是跳来跳去的。这种可能性最大,你需要检查一下你调试的二进制文件是不是你最新修改过的文件编译出来的。
- 也可能是调试器的原因,但只有很小的可能性是这个原因。你可以升级到最新的 Android Studio 再调试看看。
请问下这个方法适合Ubuntu环境吗?我在准备输入lldb命令那一步,并不能暂停。
请问下这个方法适合Ubuntu环境吗?我在准备输入lldb命令那一步,并不能暂停。
@syjml 应该和 Ubuntu 没啥关系,只要你能看到 Debugger 应该都能暂停的。
请问下这个方法适合Ubuntu环境吗?我在准备输入lldb命令那一步,并不能暂停。
@syjml 应该和 Ubuntu 没啥关系,只要你能看到 Debugger 应该都能暂停的。
输完命令后,是按回车键继续执行吗?有没有QQ群可以交流下啊?这太慢了。
请问下这个方法适合Ubuntu环境吗?我在准备输入lldb命令那一步,并不能暂停。
@syjml 应该和 Ubuntu 没啥关系,只要你能看到 Debugger 应该都能暂停的。
输完命令后,是按回车键继续执行吗?有没有QQ群可以交流下啊?这太慢了。
@syjml 额,肯定是敲回车的,命令行都要敲回车的。没有 QQ 群,照着这篇文章一步一步操作应该都没啥问题,只是 RestartIce
这个方法你得自己在 Java 层调用一下对应的 API 才能运行到断点处。
请问下这个方法适合Ubuntu环境吗?我在准备输入lldb命令那一步,并不能暂停。
@syjml 应该和 Ubuntu 没啥关系,只要你能看到 Debugger 应该都能暂停的。
输完命令后,是按回车键继续执行吗?有没有QQ群可以交流下啊?这太慢了。
@syjml 额,肯定是敲回车的,命令行都要敲回车的。没有 QQ 群,照着这篇文章一步一步操作应该都没啥问题,只是
RestartIce
这个方法你得自己在 Java 层调用一下对应的 API 才能运行到断点处。
我这里没走到restartIce方法。可以走到SetLocalDescription方法,所以我输入的命令是image lookup -vrn webrtc::PeerConnection::setLocalDescription,结果并不起作用。
请问下这个方法适合Ubuntu环境吗?我在准备输入lldb命令那一步,并不能暂停。
@syjml 应该和 Ubuntu 没啥关系,只要你能看到 Debugger 应该都能暂停的。
输完命令后,是按回车键继续执行吗?有没有QQ群可以交流下啊?这太慢了。
@syjml 额,肯定是敲回车的,命令行都要敲回车的。没有 QQ 群,照着这篇文章一步一步操作应该都没啥问题,只是
RestartIce
这个方法你得自己在 Java 层调用一下对应的 API 才能运行到断点处。我这里没走到restartIce方法。可以走到SetLocalDescription方法,所以我输入的命令是image lookup -vrn webrtc::PeerConnection::setLocalDescription,结果并不起作用。
@syjml 我上一条回复错了,并不需要运行到 RestartIce
,只要能让 Debugger 暂停,然后在 LLDB 输入 image lookup -vrn webrtc::PeerConnection::RestartIce
并且回车,就可以看到 CompileUnit 信息了。
如果你看不到的话,可能是你的 .so 文件并没有携带调试信息(比如没有符号表),所以 LLDB 没有任何输出。或者你的 Debugger 暂停时,对应的 .so 文件还没有被加载到内存。
或者你的命令写错了,应该是 image lookup -vrn webrtc::PeerConnection::SetLocalDescription
,注意是大写的 S
。我这里执行 lookup SetLocalDescription
是有输出的,就是输出太多了,所以之前写文章的时候才推荐 RestartIce
。

请问下这个方法适合Ubuntu环境吗?我在准备输入lldb命令那一步,并不能暂停。
@syjml 应该和 Ubuntu 没啥关系,只要你能看到 Debugger 应该都能暂停的。
输完命令后,是按回车键继续执行吗?有没有QQ群可以交流下啊?这太慢了。
@syjml 额,肯定是敲回车的,命令行都要敲回车的。没有 QQ 群,照着这篇文章一步一步操作应该都没啥问题,只是
RestartIce
这个方法你得自己在 Java 层调用一下对应的 API 才能运行到断点处。我这里没走到restartIce方法。可以走到SetLocalDescription方法,所以我输入的命令是image lookup -vrn webrtc::PeerConnection::setLocalDescription,结果并不起作用。
@syjml 我上一条回复错了,并不需要运行到
RestartIce
,只要能让 Debugger 暂停,然后在 LLDB 输入image lookup -vrn webrtc::PeerConnection::RestartIce
并且回车,就可以看到 CompileUnit 信息了。如果你看不到的话,可能是你的 .so 文件并没有携带调试信息(比如没有符号表),所以 LLDB 没有任何输出。或者你的 Debugger 暂停时,对应的 .so 文件还没有被加载到内存。
或者你的命令写错了,应该是
image lookup -vrn webrtc::PeerConnection::SetLocalDescription
,注意是大写的S
。我这里执行 lookupSetLocalDescription
是有输出的,就是输出太多了,所以之前写文章的时候才推荐RestartIce
。![]()
我用的是M95分支,按照你文章里修改./build/toolchain/android/BUILD.gn这个文件,没找到对应的地方。我的编译命令是
./tools_webrtc/android/build_aar.py --build-dir out --arch "arm64-v8a" --extra-gn-args='is_debug=true rtc_use_h264=true ffmpeg_branding="Chrome" treat_warnings_as_errors=false symbol_level=2 android_full_debug=true enable_stack_trace_line_numbers=true is_chrome_branded=true is_java_debug=true android_unstripped_runtime_outputs=true strip_debug_info=true'
生成的so里也能看到符号表信息。
再跟你确认下步骤。
首先修改build.gradle文件,按照你的配置来,并且修改 Debug type 设置为 Dual (Java + Native)。
然后在
private native void nativeCreateOffer(SdpObserver var1, MediaConstraints var2);
这一行下断点,命中后暂停lldb,输入
image lookup -vrn webrtc::PeerConnection::SetLocalDescription
敲回车,之后按F9继续执行。
是这样吗?
我用out/arm64-v8a/lib.unstripped目录下的so文件替换了aar里的so文件,再重复操作。在输入了
image lookup -vrn webrtc::PeerConnection::RestartIce
命令后,显示的内容里没有CompileUnit信息。
@syjml 我这边还在用 M88 版本,有时间我再看看 M95 是什么情况。可能官方的编译脚本有改动吧。
@syjml 我这边还在用 M88 版本,有时间我再看看 M95 是什么情况。可能官方的编译脚本有改动吧。
期待。。。
@syjml 我这边用最新的 M94 版本是有 CompileUnit 信息的(M95 还没有 release,不建议使用)
只需要在 ./webrtc/src/build/toolchain/android/BUILD.gn
注释掉 strip
和 use_unstripped_as_runtime_outputs
template("android_clang_toolchain") {
gcc_toolchain(target_name) {
...
# strip = "$_prefix/llvm-strip"
if (_use_debug_fission) {
dwp = _tool_prefix + "dwp"
}
# use_unstripped_as_runtime_outputs = android_unstripped_runtime_outputs
...
}
}
然后使用如下命令编译出 libwebrtc.aar 就可以了(不要用你之前写的有一堆参数的那条命令)
$ ./tools_webrtc/android/build_aar.py \
--extra-gn-args "is_debug=true symbol_level=2 android_full_debug=true" \
--arch arm64-v8a

@syjml 我这边用最新的 M94 版本是有 CompileUnit 信息的(M95 还没有 release,不建议使用)
只需要在
./webrtc/src/build/toolchain/android/BUILD.gn
注释掉strip
和use_unstripped_as_runtime_outputs
template("android_clang_toolchain") { gcc_toolchain(target_name) { ... # strip = "$_prefix/llvm-strip" if (_use_debug_fission) { dwp = _tool_prefix + "dwp" } # use_unstripped_as_runtime_outputs = android_unstripped_runtime_outputs ... } }
然后使用如下命令编译出 libwebrtc.aar 就可以了(不要用你之前写的有一堆参数的那条命令)
$ ./tools_webrtc/android/build_aar.py \ --extra-gn-args "is_debug=true symbol_level=2 android_full_debug=true" \ --arch arm64-v8a
![]()
感谢指导,可以调试了。
我尝试在Windows下调试,在Ubuntu里安装了smb服务,把webrtc路径映射到了本地磁盘。按照步骤操作。
我这里将路径
..\..\
映射为 z:\webrtc\src\
调试的时候还是不能进入cpp代码。想请教下我该怎么办?
我尝试在Windows下调试,在Ubuntu里安装了smb服务,把webrtc路径映射到了本地磁盘。按照步骤操作。
我这里将路径
..\..\
映射为z:\webrtc\src\
调试的时候还是不能进入cpp代码。想请教下我该怎么办?
没在 Windows 上调试过,你得自己研究了。
我尝试在Windows下调试,在Ubuntu里安装了smb服务,把webrtc路径映射到了本地磁盘。按照步骤操作。
我这里将路径
..\..\
映射为z:\webrtc\src\
调试的时候还是不能进入cpp代码。想请教下我该怎么办?没在 Windows 上调试过,你得自己研究了。
怎么在as里面打断点呢?用as打开webrtc项目?在设置完映射后怎么操作的?谢谢大佬
而且我执行完image lookup -vrn webrtc::PeerConnection::RestartIce 没有输出,编译命令是./tools_webrtc/android/build_aar.py --extra-gn-args "is_debug=true symbol_level=2 android_full_debug=true rtc_use_h264=true treat_warnings_as_errors=false" --arch arm64-v8a treat_warnings_as_errors 不加会报错
再次谢谢大佬
我尝试在Windows下调试,在Ubuntu里安装了smb服务,把webrtc路径映射到了本地磁盘。按照步骤操作。
我这里将路径
..\..\
映射为z:\webrtc\src\
调试的时候还是不能进入cpp代码。想请教下我该怎么办?没在 Windows 上调试过,你得自己研究了。
怎么在as里面打断点呢?用as打开webrtc项目?在设置完映射后怎么操作的?谢谢大佬
@nethrezim 映射好了以后,直接把你想打断点的文件拖进 AS 就可以了,不用 AS 打开完整的 WebRTC 项目。
而且我执行完image lookup -vrn webrtc::PeerConnection::RestartIce 没有输出,编译命令是./tools_webrtc/android/build_aar.py --extra-gn-args "is_debug=true symbol_level=2 android_full_debug=true rtc_use_h264=true treat_warnings_as_errors=false" --arch arm64-v8a treat_warnings_as_errors 不加会报错
@nethrezim 不同 WebRTC 版本可能编译参数不一样,我目前的文章都是基于 M85 (branch-head/4183) 版本写的。