Debugging managed app with SOS - the start

本文介绍了使用Windbg调试托管代码的基本步骤与技巧。首先通过.loadby加载sos扩展,并提供了一个巧妙的方法来解决启动应用程序时遇到的问题。接着,通过演示!ip2md、!dumpmt等命令的使用,展示了如何查看已编译的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Debugging managed code using windbg is always a headache to me and I kind of avoid doing that by using Visual Studio. It becomes a shame as time going since some people think I know it well. So I decided to learn from scratch - by debugging my own small app.

 

First thing is to load the sos extension. I like .loadby more than .load because it always load the correct version of sos extension. If you are debugging a dump it's easy since you can use ".loadby sos mscorwks". But .loadby doesn't work if you are starting the application with windbg since mscorwks has not been loaded yet. The workaround is a little bit tricky - type following in your debugger "sxe lh:mscorlib" then GO. This tells the debugger to stop execution when mscorlib is loaded, and of course mscorwks is loaded at that time. Afterwards you can load sos successfully using .loadby as above. Details you can refer to this excellent post.

 

Do play around !dumpmodule, !dumpmt and !dumpmd a little bit please. It took me a while to understand and remember what they are intended for given their name and their parameters' name are similar. :) We can tell which method has been jitted using !dumpmt. Powerful, isn't?

 

0:000> !ip2md @eip
MethodDesc: 007131e8
Method Name: TestException.TestFinally.Go2()
Class: 0071145c
MethodTable: 00713200
mdToken: 06000002
Module: 00712d8c
IsJitted: yes
m_CodeOrIL: 00de01c8


0:000> !dumpmt -md 00713200
EEClass: 0071145c
Module: 00712d8c
Name: TestException.TestFinally
mdToken: 02000002  (D:/Work/LearnCSharp/Exception/bin/Debug/Exception.exe)
BaseSize: 0xc
ComponentSize: 0x0
Number of IFaces in IFaceMap: 0
Slots in VTable: 8
--------------------------------------
MethodDesc Table
   Entry MethodDesc      JIT Name
79371278   7914b928   PreJIT System.Object.ToString()
7936b3b0   7914b930   PreJIT System.Object.Equals(System.Object)
7936b3d0   7914b948   PreJIT System.Object.GetHashCode()
793624d0   7914b950   PreJIT System.Object.Finalize()
0071c035   007131e0     NONE TestException.TestFinally.Go1()
00de01c8   007131e8      JIT TestException.TestFinally.Go2()
00de00f0   007131f0      JIT TestException.TestFinally.Go3()
00de00c0   007131f8      JIT TestException.TestFinally..ctor()

 

 

<think>好的,我现在需要帮助用户解决关于命令行参数的问题,具体是--remote-debugging-port=9222、--disable-infobars和--start-maximized。首先,我要确定用户的需求是什么。他们可能是在启动浏览器时遇到了问题,或者想了解这些参数的作用,尤其是在无法访问9222端口的情况下。 用户之前询问过127.0.0.1:9222无法访问的问题,现在提到的这些参数中,第一个参数和之前的端口问题相关。可能用户正在尝试配置Chrome的远程调试,但遇到了问题,所以需要详细解释这些参数的作用和使用方法。 首先,我需要分别解释每个参数的作用。--remote-debugging-port=9222用于启用远程调试端口,这通常用于开发者工具或者自动化测试,比如使用Selenium或者Puppeteer。如果用户之前遇到端口无法访问,可能是没有正确启用这个参数,或者有其他进程占用了端口。 接下来是--disable-infobars,这个参数用来隐藏Chrome启动时的信息栏,比如“Chrome正在受到自动软件的控制”这样的提示。这在自动化测试中很重要,避免提示信息干扰测试流程。 然后是--start-maximized,这个参数让浏览器启动时最大化窗口,确保页面元素可见,对于自动化测试来说,保持一致的窗口大小可以避免布局问题。 接下来需要考虑用户可能的错误使用场景。比如,用户可能没有正确关闭所有Chrome实例,导致端口被占用,或者参数格式错误。需要提醒用户在启动时确保没有其他Chrome进程运行,并且正确使用参数格式。 另外,用户可能需要示例代码来正确启动Chrome,所以提供不同操作系统下的命令示例会很有帮助,比如在Windows、macOS和Linux下的命令。同时,要指出常见问题,比如端口冲突,如何检查端口占用情况,以及如何解决权限问题。 还需要考虑用户可能遇到的权限问题,特别是在Linux系统下,可能需要使用sudo或者调整用户权限才能绑定到特定端口。此外,安全软件或防火墙可能会阻止端口访问,虽然127.0.0.1是本地回环,但某些情况下安全软件仍可能拦截,需要建议用户临时禁用防火墙测试。 最后,总结这些参数的应用场景,帮助用户理解它们的主要用途,比如在自动化测试、调试或爬虫开发中的重要性。同时,提供进一步排查问题的步骤,比如检查进程是否运行、验证端口监听状态等,确保用户能够逐步排查问题。 在回答过程中,要保持结构清晰,分点说明,每个参数单独解释,并提供示例和常见问题解决方法。避免使用过于技术化的术语,用简单明了的中文解释,确保用户能够理解并操作。</think>以下是关于命令行参数 `--remote-debugging-port=9222 --disable-infobars --start-maximized` 的详细介绍和典型使用场景: --- ### **1. 参数解析** #### **(1) `--remote-debugging-port=9222`** - **功能**:启用 Chrome/Chromium 的远程调试功能,并指定调试端口为 `9222`。 - **用途**: - 允许通过 **DevTools 协议**远程控制浏览器(如自动化测试工具 **Selenium**、**Puppeteer**)。 - 支持通过 `http://127.0.0.1:9222/json` 获取调试信息(如页面列表)。 - **示例**: ```bash $ chrome --remote-debugging-port=9222$ ``` #### **(2) `--disable-infobars`** - **功能**:隐藏浏览器顶部的提示栏(如“Chrome 正受到自动测试软件控制”)。 - **用途**: - 避免自动化测试时提示栏干扰页面布局或触发误操作。 - **示例**: ```bash $ chrome --disable-infobars$ ``` #### **(3) `--start-maximized`** - **功能**:启动浏览器时自动最大化窗口。 - **用途**: - 确保测试或调试时窗口尺寸一致,避免响应式布局问题。 - **示例**: ```bash $ chrome --start-maximized$ ``` --- ### **2. 典型使用场景** #### **场景1:自动化测试(如 Puppeteer)** ```javascript const puppeteer = require('puppeteer'); async function run() { // 连接已启动的 Chrome 实例 const browser = await puppeteer.connect({ browserURL: 'http://127.0.0.1:9222', defaultViewport: null }); const page = await browser.newPage(); await page.goto('https://example.com'); } run(); ``` #### **场景2:调试已打开的浏览器** 1. 启动 Chrome: ```bash $ chrome --remote-debugging-port=9222 --disable-infobars --start-maximized$ ``` 2. 访问 `http://127.0.0.1:9222` 查看可调试的页面列表。 3. 使用 **DevTools** 或脚本直接调试指定页面。 --- ### **3. 常见问题与解决** #### **问题1:端口 `9222` 被占用** - **解决方法**: - 终止占用端口的进程: ```bash $ kill $(lsof -t -i :9222)$ # Linux/macOS $ taskkill /PID $(netstat -ano | findstr :9222 | awk '{print $5}') /F$ # Windows ``` - 更换端口号(如 `--remote-debugging-port=9223`)。 #### **问题2:参数未生效** - **可能原因**: - 未完全关闭所有 Chrome 进程(残留进程占用配置)。 - 参数拼写错误(如缺少 `=` 或拼写为 `--disable-info-bars`)。 - **解决步骤**: 1. 彻底关闭所有 Chrome 进程: ```bash $ pkill -f chrome$ # Linux/macOS $ taskkill /IM chrome.exe /F$ # Windows ``` 2. 重新启动并严格按格式输入命令。 --- ### **4. 参数组合示例** #### **完整启动命令** ```bash # Linux/macOS $ /path/to/chrome --remote-debugging-port=9222 --disable-infobars --start-maximized$ # Windows $ "C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 --disable-infobars --start-maximized$ ``` --- ### **5. 注意事项** - **安全性**:开放远程调试端口(如 `9222`)可能允许本地网络的其他设备连接,生产环境中需谨慎使用。 - **兼容性**:部分参数可能因 Chrome 版本更新而变动,建议查阅官方文档([Chrome Flags](https://peter.sh/experiments/chromium-command-line-switches/))。 --- 通过上述参数组合,可实现浏览器的自动化调试与测试,同时保持界面整洁和窗口最大化。若仍遇到问题,建议检查浏览器版本或尝试最小化参数组合逐步排查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值