lldb 调试 linux下 .net Core 总结及开源扩展 yinuo

相信很多朋友在跟随微软.net core 从windows平台迁移至linux平台的过程中遇到很多别扭的地方,这里我只聊聊 运行时 调试的那些事儿。

  • 首先从工具上来讲Windows上的windbg肯定是运行时的首选调试工具(因为有对应版本的SOS.dll),在linux平台运行时调试需要切换到lldb (Only lldb is supported by the SOS plugin. gdb can be used to debug the coreclr code but with no SOS support.)
    调试器的原理和功能基本一样,但细节到某个功能的命令自然会有区别,尤其是熟练了其中1个的命令之后(比如之前在看汇编的时候是Intel格式,现在要适用AT&T格式)…

这里先总结一些个人常用的命令在 windbg下和lldb下的对比:

  • 非托管命令:

非托管命令lldbwindbg
列出当前模块image listlmf
当前线程thread list~
当前线程栈回溯thread backtracekp
所有线程栈回溯thread backtrace all~* kp
切换线程thread select 2~2s kp
查看寄存器re rr
查看内存(8字节)memory read –size 8 –format x <address>dq <address>

LLDB同GDB的命令对比:https://lldb.llvm.org/lldb-gdb.html

  • 托管命令:

这里先介绍下自己写的开源lldb调试.net Core扩展模块 Yinuo
在使用lldb调试linux .net Core程序的过程中,有很多不适应的地方,比如遍历并查看所有线程的托管栈回溯 在windbg下可以~*e !clrstack 在lldb里虽然有bt allclrstack 但是却只能手动切换单个线程再回溯,没有办法结合到一起,还有一个原因是lldb内命令输出的内容颜色统一,不太好区分重点关注的点,比如线程回溯比较关注方法名,托管对象转储比较关注内部对象地址等等,lldb的好处是支持python或者c++接口,可以通过接口方式写lldb的扩展来辅助我们调试过程,提高调试效率。
下面介绍下调试扩展 Yinuo 的加载过程:

  • 以下的软件环境 CentOS7(x64),lldb-3.6.0,python-2.7.5

  • 首先git下载模块 git clone https://github.com/espider/yinuo
    目录没有要求,但要记得,因为加载模块的时候要知道在哪。

  • 启动lldb 并附加被调试的进程 (lldb) attach -p PID

  • 加载Yinuo调试模块 (lldb) command script import ~/yinuo/ynlldb.py 之前git下来的目录里的python文件

  • 成功加载ynlldb.py后可以 help 看下当前注册进来的命令,都以 yn_ 为前缀,加载模块的时候会判断当前的.net Core版本号,并自动加载对应版本的调试插件libsosplugin.so

接下来介绍下当前注册进lldb的辅助调试命令

  • yn_heap_dump
    查看当前托管堆信息命令,以色块和色块的比例直观的感受 Gen 0,1,2 LOH 在同一个堆内的比例 以及其实际大小(这里的比例按托管堆的地址空间计算,并没有排除Free的和Gen0没有使用的地址空间,由于比例可能相去甚远所以有可能看不到某个堆的色块)

  • yn_object_dump
    转储托管对象,可以根据类型的方法表、类型名、对象地址 进行批量或者单个转储,同时计算对象(按方法表或类型的话针对每1个单独对象)所属托管堆的位置Gen 0,1,2,LOH,并统计4类堆内的数量。
    支持选项和参数

    • –methodtable/-m 转储此方法表的所有对象,后跟方法表地址;

    • –type/-t 转储此类型名的所有对象,后跟类型名(同方法表选项互斥 2选1);

    • –offset/-o 转储对象的同时是否深入转储其内部偏移对象,后跟该对象的偏移量(目前只支持1级内部偏移)

    • –address/-a 转储单个对象,后跟对象地址

    • –dumpobj/-d 是否转储对象,默认为True,如果不转储则只返回对象地址;

    • –gen/-g 是否显示对象所在的堆Gen0,1,2,LOH,默认True;

例如想要查看 类型Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Frame`1[[Microsoft.AspNetCore.Hosting.Internal.HostingApplication+Context, Microsoft.AspNetCore.Hosting]] 方法表地址 00007ff8711df620 可以这样写转储命令:

这里会对输出内容做下颜色处理,比如我们比较关心其内部成员的Value这列,如果是地址的话会显示成黄色,方便调试时候的快速定位。

如果想要转储某个对象可以这样写,根据对象地址:

发现对象内的某个成员比较感兴趣,例如 刚刚的对象内偏移 0xe0 位置是 RawTarget

想对其进行偏移转储 可以这样写:

  • yn_thread_clrstack
    显示某个线程或者所有线程的托管栈回溯,不指定选项 –thread/-t 的话默认显示当前线程的托管栈回溯, -t 跟线程index可以回溯指定线程,或者 跟 all,来批量显示所有线程的托管栈回溯,参数 -a 可选(此为SOS命令clrstack可选参数)

这里也对输出的内容做了颜色处理,比如IP指令指针列和CallSite是我们比较关注的,这里分别用黄色和绿色标注。

  • yn_thread_pe
    显示某个线程或者所有线程托管异常,选项同 yn_thread_clrstack 一样

  • yn_transfer
    此命令只用于转移执行其他lldb命令,因为yinuo项目调试的时候会在当前目录生成一个log文件(ynlldb.log)会把所有执行的yinuo命令及输出写入日志便于以后的查询,使用例如:yn_transfer dumpheap -stat 会执行 dumpheap -stat 并把结果输出到终端和日志文件里。

  • Yinuo 项目 License 采用 BSD,大家有兴趣可以自己调整或者联系我共同维护,实现自己的调试命令比较简单,git项目内的 commandlist 目录,所有自动注册的调试命令都在这里以,自命名.py文件即可,内容例子及说明如下:



#!/usr/bin/python

# coding:utf-8

import lldb

import commandlist.ynbase as yn

from util.colorstyle import *

from util.exportcontent import *

"""这里把自定义类型注册进来等待加载的时候自动注册"""

def register_lldb_commands():

return [

YNTransfer()

]

"""自定义类型继承自yn.YNCommand即可"""

class YNTransfer(yn.YNCommand):

""" transfer lldb command and exe it for log """

def __init__(self):

pass

"""这个是注册到lldb里的命令名字"""

def name(self):

# register function name in lldb

return 'yn_transfer'

"""如果有选项的话在这里定义,基于python argparse模块实现的 """

def options(self):

return [

]

"""描述信息"""

def description(self):

return 'Transfer lldb command for log,e.g. arguments: dumpheap -stat'

"""这里是实际命令的具体实现了"""

def run(self, options, arguments):

target = lldb.debugger.GetSelectedTarget()

if target:

if arguments:

YNTransfer.handle_command(arguments)

else:

export_content('    no arguments in yn_transfer.')

else:

export_content('    no target in current debugger.')

   @staticmethod

def handle_command(args):

(ci, result) = yn.run_log_command(

" " + (" ".join(args) if len(args) > 0 else ''))

success = result.Succeeded()

if success:

output = result.GetOutput()

contents = output.strip()

lines = contents.splitlines(False)

for i in range(len(lines)):

export_content('    %s' % lines[i])

else:

export_content(

'    error="%s"' %

use_style_level(

important_level['high2'],

result.GetError()))

export_content(

'    %s   ' %

use_style_level(

important_level['low2'],

'-------------'))


参考文档:

https://github.com/dotnet/coreclr/blob/master/Documentation/building/debugging-instructions.md
https://lldb.llvm.org/python-reference.html
https://github.com/llvm-mirror/lldb
https://github.com/facebook/chisel

相关文章: 

  • 快速搭建本地 .NET Core 运行时调试环境

原文地址:https://espider.github.io/NET-Core/lldb-dotnet-core-python/


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

班级日常分享:一天一瞬间!

好久没有记录班级日常了&#xff0c;自运动会结束之后&#xff0c;事情比较多&#xff0c;也很忙&#xff0c;所以没有及时记录。19级3班最近在上bootstrap&#xff0c;属于前端的范畴&#xff0c;内容较简单&#xff0c;同学们都能跟的上老师的步伐&#xff0c;一行一行大代码…

Java 程序员必须掌握的 8 道数据结构面试题,你会几道

转载自 Java 程序员必须掌握的 8 道数据结构面试题&#xff0c;你会几道 瑞士计算机科学家Niklaus Wirth在1976年写了一本书&#xff0c;名为《算法数据结构编程》。 40多年后&#xff0c;这个等式仍被奉为真理。这就是为什么在面试过程中&#xff0c;需要考察软件工程师对数…

vue.js 01 模板语法

文章目录vue插值vue指令vue插值 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&…

如何使用bootstrap实现轮播图?

大家好&#xff0c;我是雄雄&#xff0c;今天给大家分享的是如何使用bootstrap实现轮播图&#xff0c;美观大方且兼容性还好&#xff01;轮播图就不做过多的介绍了&#xff0c;大家都知道&#xff0c;只是轮播的实现有多种方式&#xff0c;例如使用纯js写&#xff0c;费时费力&…

Visual Studio Code: 利用 MSSQL 插件创建数据库 IDE

尽管面对繁重的 .NET 开发任务 Visual Studio 仍是我的首选 IDE&#xff0c;但我却已深深迷恋上 Visual Studio Code (VS Code)&#xff0c;无论我使用的语言是 C#、JavaScript 还是 Node&#xff0c;也无论我使用的操作系统是 Windows 还是 macOS。 当然&#xff0c;VS Code 及…

binarySearch与IndexOf的那些事儿~

大家好&#xff0c;我是雄雄&#xff0c;今天我们来看看java中的binarySearch方法&#xff01;我们都知道&#xff0c;如果我们想要在一个集合中查找某个元素所在的位置时&#xff0c;可以使用list类自带的indexOf方法&#xff0c;简单方便还快捷。不过&#xff0c;Collections…

两张趣图助你理解 HTTP 状态码

转载自 两张趣图助你理解 HTTP 状态码 HTTP状态码&#xff08;HTTP Status Code&#xff09;是用以表示网页服务器HTTP响应状态的3位数字代码。 我们可以通过查看HTTP状态码来判断服务器状态&#xff0c;常见的有404 、502等&#xff1b;但是其他不是很常见的状态码都代表什…

Java中的binarySearch方法

大家好&#xff0c;我是雄雄&#xff0c;今天我们来看看java中的binarySearch方法&#xff01; 前言&#xff1a;我们都知道&#xff0c;如果我们想要在一个集合中查找某个元素所在的位置时&#xff0c;可以使用list类自带的indexOf方法&#xff0c;简单方便还快捷。不过&…

ASP.NET Core 开源论坛项目 NETCoreBBS

ASP.NET Core 轻量化开源论坛项目&#xff0c;ASP.NET Core Light forum NETCoreBBS 采用 ASP.NET Core EF Core Sqlite Bootstrap 开发。 GitHub: https://github.com/linezero/NETCoreBBS 开发 git clone https://github.com/linezero/NETCoreBBS.git使用 Visual Studi…

使用相对长度单位em布局网页内容

顺便问一下哈&#xff1f;那个辣椒酱大家感觉怎么样&#xff0c;你们也买了也尝了&#xff0c;是不是该反馈反馈啦~~如果还有想要的&#xff0c;可以联系我呐&#xff01;原文地址&#xff1a;自从有了这款辣椒酱&#xff0c;拌饭再也不用老干妈前言&#xff1a;在页面开发中&a…

史上最全的 MySQL 高性能优化实战总结

转载自 史上最全的 MySQL 高性能优化实战总结 一、前言 MySQL 对于很多 Linux 从业者而言&#xff0c;是一个非常棘手的问题&#xff0c;多数情况都是因为对数据库出现问题的情况和处理思路不清晰。在进行 MySQL 的优化之前必须要了解的就是 MySQL 的查询过程&#xff0c;很…

.NET Core快速入门教程 3、我的第一个.NET Core App (CentOS篇)

一、前言 本篇开发环境&#xff1f;1、操作系统&#xff1a;CentOS7&#xff08;因为ken比较偏爱CentOS7&#xff09;2、SDK版本&#xff1a;.NET Core 2.0 Preview你可能需要的前置知识1、了解如何通过Hyper-V安装CentOS虚拟机2、了解CentOS7基础命令/常用命令 二、安装 .NE…

RPC(远程过程调用)

1、RPC和HTTP对比 1.1 具体实现 RPC&#xff1a;可以基于TCP协议&#xff0c;也可以基于HTTP协议。 HTTP&#xff1a;基于HTTP协议 1.2 效率 RPC&#xff1a;自定义具体实现可以减少很多无用的报文内容&#xff0c;使得报文体积更小。 HTTP&#xff1a;如果是HTTP 1.1 报文中很…

【2018.3.24】模拟赛之四-ssl2548 旋转【暴力模拟】

正题 大意 给出一块黑块和白块组成的版&#xff0c;将其旋转90后和之前的黑块叠加&#xff0c;求最初始和每次旋转后的黑块数。 解题思路 暴力模拟不解释 代码 #include<cstdio> #include<iostream> using namespace std; int n,s; char c[51][51],a[51][51];…

使用相对长度单位rem布局网页内容

前言&#xff1a;上篇我们提到了相对单位em的用法&#xff0c;知道了em的概念&#xff0c;即是一个相对的单位&#xff0c;也知道了em的值不是固定的&#xff0c;p标签里的em和p里面的div下面的1em的px值并不是一样的。具体是多少呢&#xff1f;那就得看一下父级元素的值了&…

告诉你,Spring Boot 真是个牛逼货

转载自 告诉你&#xff0c;Spring Boot 真是个牛逼货 现在 Spring Boot 非常火&#xff0c;各种技术文章&#xff0c;各种付费教程&#xff0c;多如牛毛&#xff0c;可能还有些不知道 Spring Boot 的&#xff0c;那它到底是什么呢&#xff1f;有什么用&#xff1f;今天给大家…

集合还有这么优雅的运算法?

前言&#xff1a;在初中数学&#xff0c;我们也有集合的概念&#xff0c;非但如此&#xff0c;还有集合中的一些运算&#xff0c;例如交集、并集、差集等&#xff0c;那么我们java中的集合是否有这样的运算呢&#xff1f;今天我们就一起来看看&#xff01;01并集就是将两个集合…

.NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)

一、前言 本篇开发环境&#xff1f;1、操作系统&#xff1a; Windows 10 X642、SDK&#xff1a; .NET Core 2.0 Preview 二、安装 .NET Core SDK 1、下载 .NET Core下载地址&#xff1a;https://www.microsoft.com/net/download/core根据自己电脑情况选择对应版本即可.NET C…

【2018.3.24】模拟赛之六-ssl2550 重要人物【图论,最短路,SPFA】

正题 大意 有一个大人物&#xff0c;它要从经过一些地方&#xff0c;他所在的路会被封闭&#xff08;不可以进入&#xff0c;可以出&#xff09;。你要从一个点到到另一个点&#xff0c;求最短时间。 解题思路 求出每条路的封闭时间&#xff0c;然后SPFA 代码 #include<…

今天 ,给大家变个魔术!!!

前言&#xff1a;在对网页进行布局时&#xff0c;当我们设置div的的宽为固定宽时&#xff0c;理论上&#xff0c;内容是不会超出div的&#xff0c;那你有没有见过内容超出div固定宽度的情况呢&#xff1f;今天我们就来看看到底是怎么一回事&#xff1f;看分析之前&#xff0c;我…