webrtc-tutorial icon indicating copy to clipboard operation
webrtc-tutorial copied to clipboard

basic/webrtc-breakpoint/ - 断点调试 - WebRTC 学习指南

Open utterances-bot opened this issue 3 years ago • 38 comments

断点调试 - WebRTC 学习指南

Learning WebRTC the Hard Way 👀

https://webrtc.mthli.com/basic/webrtc-breakpoint/

utterances-bot avatar May 18 '21 15:05 utterances-bot

请问下这里有办法语法高亮c++代码吗

tyrionchen avatar May 18 '21 15:05 tyrionchen

请问下这里有办法语法高亮c++代码吗

@tyrionchen 可以呀,代码高亮用的是 https://prismjs.com/#examples ,默认 C 系列语言的高亮都支持的。

mthli avatar May 19 '21 01:05 mthli

是说在Android Studio里面单步C++代码的时候高亮,这个可以么?

tyrionchen avatar May 19 '21 02:05 tyrionchen

是说在Android Studio里面单步C++代码的时候高亮,这个可以么?

@tyrionchen 这个截图里,当前单步的行就是高亮蓝色;如果单步到下一行,下一行就是高亮蓝色。

mthli avatar May 19 '21 03:05 mthli

是说c++的代码语法高亮 比如这个类名PeerConnection和方法名createOffer,现在是白的,应该点击也不能跳转

tyrionchen avatar May 19 '21 03:05 tyrionchen

是说c++的代码语法高亮 比如这个类名PeerConnection和方法名createOffer,现在是白的,应该点击也不能跳转

@tyrionchen 额,那确实不可以。一般查看或者修改 WebRTC 代码的话,还是在 VS Code 里;Android Studio 只是用来断点调试的。

mthli avatar May 19 '21 04:05 mthli

明白了,感谢解答~

tyrionchen avatar May 19 '21 08:05 tyrionchen

你好,我在单步调试native代码的时候调试器并不能正确地跳转到下一步,比如一段顺序执行的代码,断点打在第417行,执行下一步时高亮的不是第418行的代码,而是450行的代码,再执行几次下一步之后又会跳转到444行,请问这是怎么回事呢?是编译优化的问题吗?

CaoFang98 avatar Aug 07 '21 10:08 CaoFang98

你好,我在单步调试native代码的时候调试器并不能正确地跳转到下一步,比如一段顺序执行的代码,断点打在第417行,执行下一步时高亮的不是第418行的代码,而是450行的代码,再执行几次下一步之后又会跳转到444行,请问这是怎么回事呢?是编译优化的问题吗?

@CaoFang98 可以说下具体是哪个文件(或者哪个类)的 417 行嘛?我这边也打个断点看看。

mthli avatar Aug 07 '21 10:08 mthli

src/third_party/libvpx/source/libvpx/vp9/vp9_dx_iface.c 文件的 init_decoder 函数上,我修改了这个文件,原文件中这个函数大概在254行。谢谢!

CaoFang98 avatar Aug 07 '21 10:08 CaoFang98

src/third_party/libvpx/source/libvpx/vp9/vp9_dx_iface.c 文件的 init_decoder 函数上,我修改了这个文件,原文件中这个函数大概在254行。谢谢!

@CaoFang98 我这边的项目用的不是 VP9 编码器,所以没法断点了。

但是我大概浏览了一下这个文件,在 init_decoder 打断点应该不会出现你说的跳来跳去的问题。所以我怀疑可能有两种原因:

  1. 你的二进制文件的符号表和你打断点的文件的映射出错了,所以单步的时候调试器根据符号表还原到文件上就是跳来跳去的。这种可能性最大,你需要检查一下你调试的二进制文件是不是你最新修改过的文件编译出来的。
  2. 也可能是调试器的原因,但只有很小的可能性是这个原因。你可以升级到最新的 Android Studio 再调试看看。

mthli avatar Aug 11 '21 11:08 mthli

请问下这个方法适合Ubuntu环境吗?我在准备输入lldb命令那一步,并不能暂停。

syjml avatar Sep 18 '21 01:09 syjml

请问下这个方法适合Ubuntu环境吗?我在准备输入lldb命令那一步,并不能暂停。

@syjml 应该和 Ubuntu 没啥关系,只要你能看到 Debugger 应该都能暂停的。

mthli avatar Sep 18 '21 06:09 mthli

请问下这个方法适合Ubuntu环境吗?我在准备输入lldb命令那一步,并不能暂停。

@syjml 应该和 Ubuntu 没啥关系,只要你能看到 Debugger 应该都能暂停的。

输完命令后,是按回车键继续执行吗?有没有QQ群可以交流下啊?这太慢了。

syjml avatar Sep 22 '21 03:09 syjml

请问下这个方法适合Ubuntu环境吗?我在准备输入lldb命令那一步,并不能暂停。

@syjml 应该和 Ubuntu 没啥关系,只要你能看到 Debugger 应该都能暂停的。

输完命令后,是按回车键继续执行吗?有没有QQ群可以交流下啊?这太慢了。

@syjml 额,肯定是敲回车的,命令行都要敲回车的。没有 QQ 群,照着这篇文章一步一步操作应该都没啥问题,只是 RestartIce 这个方法你得自己在 Java 层调用一下对应的 API 才能运行到断点处。

mthli avatar Sep 22 '21 07:09 mthli

请问下这个方法适合Ubuntu环境吗?我在准备输入lldb命令那一步,并不能暂停。

@syjml 应该和 Ubuntu 没啥关系,只要你能看到 Debugger 应该都能暂停的。

输完命令后,是按回车键继续执行吗?有没有QQ群可以交流下啊?这太慢了。

@syjml 额,肯定是敲回车的,命令行都要敲回车的。没有 QQ 群,照着这篇文章一步一步操作应该都没啥问题,只是 RestartIce 这个方法你得自己在 Java 层调用一下对应的 API 才能运行到断点处。

我这里没走到restartIce方法。可以走到SetLocalDescription方法,所以我输入的命令是image lookup -vrn webrtc::PeerConnection::setLocalDescription,结果并不起作用。

syjml avatar Sep 22 '21 07:09 syjml

请问下这个方法适合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

SetLocalDescription

mthli avatar Sep 22 '21 12:09 mthli

请问下这个方法适合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

SetLocalDescription

我用的是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里也能看到符号表信息。 image

再跟你确认下步骤。 首先修改build.gradle文件,按照你的配置来,并且修改 Debug type 设置为 Dual (Java + Native)。 然后在 private native void nativeCreateOffer(SdpObserver var1, MediaConstraints var2); 这一行下断点,命中后暂停lldb,输入 image lookup -vrn webrtc::PeerConnection::SetLocalDescription 敲回车,之后按F9继续执行。

是这样吗?

syjml avatar Sep 23 '21 06:09 syjml

我用out/arm64-v8a/lib.unstripped目录下的so文件替换了aar里的so文件,再重复操作。在输入了 image lookup -vrn webrtc::PeerConnection::RestartIce命令后,显示的内容里没有CompileUnit信息。 截屏2021-09-24 下午11 19 23

syjml avatar Sep 24 '21 15:09 syjml

@syjml 我这边还在用 M88 版本,有时间我再看看 M95 是什么情况。可能官方的编译脚本有改动吧。

mthli avatar Sep 25 '21 10:09 mthli

@syjml 我这边还在用 M88 版本,有时间我再看看 M95 是什么情况。可能官方的编译脚本有改动吧。

期待。。。

syjml avatar Sep 26 '21 01:09 syjml

@syjml 我这边用最新的 M94 版本是有 CompileUnit 信息的(M95 还没有 release,不建议使用)

只需要在 ./webrtc/src/build/toolchain/android/BUILD.gn 注释掉 stripuse_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
截屏2021-10-03 11 13 36

mthli avatar Oct 03 '21 03:10 mthli

@syjml 我这边用最新的 M94 版本是有 CompileUnit 信息的(M95 还没有 release,不建议使用)

只需要在 ./webrtc/src/build/toolchain/android/BUILD.gn 注释掉 stripuse_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
截屏2021-10-03 11 13 36

感谢指导,可以调试了。

syjml avatar Oct 09 '21 00:10 syjml

我尝试在Windows下调试,在Ubuntu里安装了smb服务,把webrtc路径映射到了本地磁盘。按照步骤操作。

微信截图_20211202203547 我这里将路径 ..\..\ 映射为 z:\webrtc\src\ 调试的时候还是不能进入cpp代码。想请教下我该怎么办?

syjml avatar Dec 02 '21 12:12 syjml

我尝试在Windows下调试,在Ubuntu里安装了smb服务,把webrtc路径映射到了本地磁盘。按照步骤操作。

微信截图_20211202203547 我这里将路径 ..\..\ 映射为 z:\webrtc\src\ 调试的时候还是不能进入cpp代码。想请教下我该怎么办?

没在 Windows 上调试过,你得自己研究了。

mthli avatar Apr 02 '22 08:04 mthli

我尝试在Windows下调试,在Ubuntu里安装了smb服务,把webrtc路径映射到了本地磁盘。按照步骤操作。 微信截图_20211202203547 我这里将路径 ..\..\ 映射为 z:\webrtc\src\ 调试的时候还是不能进入cpp代码。想请教下我该怎么办?

没在 Windows 上调试过,你得自己研究了。

怎么在as里面打断点呢?用as打开webrtc项目?在设置完映射后怎么操作的?谢谢大佬

nethrezim avatar Jun 13 '22 12:06 nethrezim

而且我执行完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 avatar Jun 13 '22 13:06 nethrezim

再次谢谢大佬

nethrezim avatar Jun 13 '22 13:06 nethrezim

我尝试在Windows下调试,在Ubuntu里安装了smb服务,把webrtc路径映射到了本地磁盘。按照步骤操作。 微信截图_20211202203547 我这里将路径 ..\..\ 映射为 z:\webrtc\src\ 调试的时候还是不能进入cpp代码。想请教下我该怎么办?

没在 Windows 上调试过,你得自己研究了。

怎么在as里面打断点呢?用as打开webrtc项目?在设置完映射后怎么操作的?谢谢大佬

@nethrezim 映射好了以后,直接把你想打断点的文件拖进 AS 就可以了,不用 AS 打开完整的 WebRTC 项目。

mthli avatar Jun 22 '22 16:06 mthli

而且我执行完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) 版本写的。

mthli avatar Jun 22 '22 17:06 mthli