mthli / webrtc-tutorial

Learning WebRTC the Hard Way 👀
https://webrtc.mthli.com
MIT License
175 stars 42 forks source link

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

Open utterances-bot opened 3 years ago

utterances-bot commented 3 years ago

断点调试 - WebRTC 学习指南

Learning WebRTC the Hard Way 👀

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

tyrionchen commented 3 years ago

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

mthli commented 3 years ago

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

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

tyrionchen commented 3 years ago

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

mthli commented 3 years ago

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

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

tyrionchen commented 3 years ago

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

mthli commented 3 years ago

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

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

tyrionchen commented 3 years ago

明白了,感谢解答~

CaoFang98 commented 3 years ago

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

mthli commented 3 years ago

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

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

CaoFang98 commented 3 years ago

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

mthli commented 3 years ago

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

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

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

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

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

mthli commented 2 years ago

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

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

syjml commented 2 years ago

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

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

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

mthli commented 2 years ago

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

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

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

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

syjml commented 2 years ago

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

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

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

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

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

mthli commented 2 years ago

请问下这个方法适合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
syjml commented 2 years ago

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

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

截屏2021-09-24 下午11 19 23
mthli commented 2 years ago

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

syjml commented 2 years ago

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

期待。。。

mthli commented 2 years ago

@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 commented 2 years ago

@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 commented 2 years ago

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

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

mthli commented 2 years ago

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

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

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

nethrezim commented 2 years ago

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

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

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

nethrezim commented 2 years ago

而且我执行完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 commented 2 years ago

再次谢谢大佬

mthli commented 2 years ago

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

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

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

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

mthli commented 2 years ago

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

xujingzhou commented 2 years ago

@syjml @mthli

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

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

问题解决了么?我遇到类似的问题:采用m98版本,在win10下用android studio尝试上述步骤,没有compile unit。再往下到断点处,出现如下提示就不再走了: Signal: SIGSEGV (signal SIGSEGV: invalid address (fault address: 0x0)) Signal: SIGSTOP (signal SIGSTOP)

xujingzhou commented 2 years ago

windows下的android studio动态联调webrtc库代码可以了,之前没成功是本人一直在模拟器上运行但却没有打包x86和x86-64的包,打上以后就好了!

SummerLeeK commented 1 year ago

你好,请问下你这个Android studio版本是多少。我目前按照你的步骤来,image lookup -vrn webrtc::PeerConnection::RestartIce 没有任何输出。而且image list也没有webrtc的so库加载进来。请问你知道这种情况如何处理吗

SummerLeeK commented 1 year ago

找到解决方法了,将单独一份so文件放在libs->arm64-v8a文件夹中。再在项目的build.gradle文件中增加一下代码,即可解决 sourceSets { main { jniLibs.srcDirs = ['libs'] } }

Janzer commented 1 year ago

找到解决方法了,将单独一份so文件放在libs->arm64-v8a文件夹中。再在项目的build.gradle文件中增加一下代码,即可解决 sourceSets { main { jniLibs.srcDirs = ['libs'] } }

我也出现了这个问题,请问你知道aar调试image list也没有webrtc的so库的原因是什么吗?如果每次编译后都要将aar里的so复制出来太麻烦了

SummerLeeK commented 1 year ago

找到解决方法了,将单独一份so文件放在libs->arm64-v8a文件夹中。再在项目的build.gradle文件中增加一下代码,即可解决 sourceSets { main { jniLibs.srcDirs = ['libs'] } }

我也出现了这个问题,请问你知道aar调试image list也没有webrtc的so库的原因是什么吗?如果每次编译后都要将aar里的so复制出来太麻烦了

不知道。我目前是为了调试原理,复制次数不多,所以没继续往下解决问题,如果你找到了解决方法,请贴出来帮助后来人。。

heylee-svg commented 1 year ago

webrtc 代码在ubuntu 本地 按楼主的步骤编译参数做的修改 BUILD.gn 跟 build.gradle 编译参数为: gn gen out/Debug --args='target_os="android' target_cpu="arm64" is_debug=true symbol_level=2 android_full_debug=true" 然后 autoninja -C out/Debug生成了 libjingle_peerconnection.so用的这个so来debug 的 没法进到C++层 是需要Debbger symbol Directories 跟LLDB Startup Commands 配置点什么吗? 期待回复 谢谢!

heylee-svg commented 1 year ago

@SummerLeeK copy的这个问题 可以用linux 的ln -s软链接来解决 将webrtc 编译的库 ln 到android demo这边