GDB之(1)入门指令参数介绍

GDB之(1)基础入门指令参数介绍

Author:Once Day Date: 2022年7月29日/2024年2月26日

漫漫长路,才刚刚开始…

全系列文章请查看专栏: Linux实践记录_Once-Day的博客-CSDN博客

推荐参考文档:

  • GDB: The GNU Project Debugger (sourceware.org)
  • GDB Documentation (sourceware.org)
  • 用GDB调试程序 _CSDN博客 _陈皓
  • linux下gdb调试方法与技巧整理-CSDN博客_花开蝶自来

文章目录

      • GDB之(1)基础入门指令参数介绍
        • 1.引言
        • 2. 程序运行时,可设置的环境和变量
          • 2.1 程序运行参数
          • 2.2 运行环境
          • 2.3 工作目录
          • 2.4 程序的输入输出
        • 3.暂停程序
          • 3.1 设置断点
          • 3.2 设置观察点
          • 3.3 设置捕捉点
        • 4.清除停止点
        • 5. 恢复程序运行和单步调试
        • 6.信号处理
        • 7. 多线程
        • 8. 查看栈信息
        • 9.显示源代码
          • 9.1 源码搜索
          • 9.2 指定源文件的路径
          • 9.3 查看源代码在内存中的地址
        • 10. 查看运行时数据
          • 10.1 使用examine(x)查看内存地址的值
          • 10.2 自动显示
        • 11.设置显示(print)选项
          • 11.2 print历史记录
          • 11.3 GDB环境变量
          • 11.4 查看寄存器
        • 12. 查看内存映射信息
          • 12.1 查看虚拟地址映射情况
          • 12.2 查看动态库加载情况
          • 12.3 加载特定动态库的符号表

1.引言

使用gcc编译c/c++时,需要使用-g来生成调试信息。

启动gdb有以下几种,program即需要调试的执行文件:

  • gdb <program>

  • gdb <program> core,配合coredump进行调试。

  • gdb <program> <PID>,指定服务程序的运行时的进程ID,gdb会自动attach上去。

启动时可以加入一些常用的参数:

  • -s,从指定文件读取符号表

  • -se,从指定文件读取符号表信息,并把他用在可执行文件中

  • -c,调试时,coredump的core文件

  • -d,加入一个源文件的搜索路径,默认搜索路劲是环境变量中PATH所定义的路径

gdb环境之下可以运行shell命令以及make命令:

(gdb) shell ls 
(gdb) make [args]
2. 程序运行时,可设置的环境和变量
2.1 程序运行参数

set设置程序开始运行时的输入参数,show展示目前的参数列表。

(gdb) set args 15 "145" 155 145
(gdb) show args
Argument list ...  is "15 "145" 155 145".

用于main(int,char*)的参数输入。

2.2 运行环境

path设定程序的运行路径,show查看程序的运行路径,set environment 设置环境变量,show environment查看环境变量。

(gdb) path .
Executable and object file path: /home/onceday/new:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
(gdb) show path
Executable and object file path: /home/onceday/new:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
(gdb) set environment ONCE=day
(gdb) show environment ONCE
ONCE = day

环境变量用于main(argc,argv,env)中的env。

2.3 工作目录

cd切换目录, pwd显示当前目录。

2.4 程序的输入输出

info terminal 显示你程序用到的终端模式

run > outfile 使用重定向控制程序输出

tty /dev/ttyb 可以指写输入输出的终端设备

3.暂停程序

当程序暂停时,可用info program来查看程序信息。

有如下几种暂停方式:

  • 断点(Breakpoint)

  • 观察点(WatchPoint)

  • 捕捉点(CatchPoint)

  • 信号(Signals)

  • 线程停止(Thread Stops)

可使用c或者continue命令恢复程序运行。

3.1 设置断点
  1. break <function>,在进入指定函数时停住, 可以增加类名和类型名

  2. break <linenum>,在指定行号停住

  3. break +offset /break -offset,在当前行号的前面或后面offset行停住

  4. break filename:linenum,在源文件filename的linenum行处停住

  5. break filename:function,在源文件filename的function函数的入口处停住

  6. break *address,在程序运行的内存地址处停住

  7. break ,在下一条指令处停住

  8. break ... if <condition>...表示上述的参数,这个可以在条件成立时停住。

3.2 设置观察点

观察点一般是来观察某个表达式(变量也是一种表达式)的值是否有变化,如果有变化,马上停止程序。

  1. watch <expr>,为表达式(变量),设置观察点,一旦表达式值有变化,马上停止程序。

  2. rwatch <expr>,当表达式(变量),被读时,停住程序。

  3. awatch <expr>,当表达式(变量)的值被读或者写的时候,停住程序。

  4. info watchpoints,列出当前所设置了的所有观察点。

3.3 设置捕捉点

可以设置捕捉点来捕捉程序运行时的一些事情,如:载入共享库(动态链接库)或是C++的异常。

catch <event>
catch assert -- Catch failed Ada assertions, when raised.
catch catch -- Catch an exception, when caught.
catch exception -- Catch Ada exceptions, when raised.
catch exec -- Catch calls to exec.
catch fork -- Catch calls to fork.
catch handlers -- Catch Ada exceptions, when handled.
catch load -- Catch loads of shared libraries.
catch rethrow -- Catch an exception, when rethrown.
catch signal -- Catch signals by their names and/or numbers.
catch syscall -- Catch system calls by their names, groups and/or numbers.
catch throw -- Catch an exception, when thrown.
catch unload -- Catch unloads of shared libraries.
catch vfork -- Catch calls to vfork.
4.清除停止点

清除停止点:

  1. clear,清除所有的已定义的停止点。

  2. clear <[filename:]function>,清除所有设置在函数上的停止点。

  3. clear <[filename:]function>,清除所有设置在指定行上的停止点。

  4. delete breakpoints,删除指定的断点,breakpoints为断点号。

  5. delete range...,删除指定范围内的断点。

  6. delete,删除所有断点。

  7. disable breakpoints,停止指定的断点。

  8. disable range...,停止指定范围内的断点。

  9. disable,停止所有断点

  10. enable [breakpoints] [range...],使能断点

  11. enable [breakpoints] once range...,使能一次,程序停止后 ,会被GDB自动disable。

  12. enable [breakpoints] delete range...,使能一次,程序停止后,会被GDB自动删除。

可以用condition修改断点的停止条件,即满足后面的表达式:

condition <bnum> <expression> #修改断点号bnum的停止条件为expression
condition <bnum>  #清除断点号为bnum的停止条件

比较特殊的维护命令ignore,可以指定程序运行,忽略停止条件几次。

ignore <bnum> <count>

还可以为停止点设定运行命令:

当运行程序被停止住时,可以让其自动运行一些别的命令。

commands [bnum]
... command-list ...
end

实例如下:

break foo if x>0
commands
printf "x is %d/n",x
continue
end
5. 恢复程序运行和单步调试

当程序被停住了,可以用continue命令恢复程序的运行直到程序结束,或者下一个断点的到来。如下三个命令:

continue [ignore-count]
c [ignore-count]
fg [ignore-count]

ignore-count表示忽略其后的断点次数。

单步跟踪step,如果有函数调用,会进入该函数,前提是此函数被编译有debug信息。

step <count> #count表示执行指令的条数,不加则为1

单步跟踪next,如果有函数调用,不会进入该函数。

next <count> #count表示执行指令的条数,不加则为1

可以打开step-mode模式,在进行单步跟踪时,程序不会因为没有debug信息而靠不住。

set step-mode on
set step-mode off 

finish运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值即参数值等信息。

until 或 u 可以在一个循环体内单步跟踪,这个命令可以运行程序直到退出循环体。

stepi或si,nexti或ni:单步跟踪一条机器指令,一条程序代码有可能由数条机器指令完成。

6.信号处理

GDB可以在调试程序的时候处理任何一种信号。当收到指定的信号时,拿上停住正在运行的程序,以供你进行调试。

handle <signal> <keywords ...>

信号可以书写为:SIGIO-SIGKILL

关键字有以下几种:

  • nostop,收到信号时,GDB不会停住,但可以打印出消息。

  • stop,当被调试的程序收到信号时,GDB会停住你的程序。

  • print,当被调试的程序收到信号时,GDB会显示出一条信息。

  • noprint,当被调试的程序收到信号时,GDB不会告诉你收到信号的信息。

  • pass noignore,当被调试的程序收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程序会处理。

  • nopass ignore,当被调试的程序收到信号时,GDB不会让被调试程序来处理这个信号。

可以使用info signalsinfo handle查看有哪些信号在被GDB检测中。

7. 多线程

在多线程上定义断点:

break <linespec> thread <threadno>
break <linespec> thread <threadno> if ...

linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID。

ID由GDB分配的,可以通过“info threads”命令来查看正在运行程序中的线程信息。

如果不指定thread <threadno>,则表示断点设在所有线程上面。

还可以为某线程指定断点条件。如

(gdb) break frik.c:13 thread 28 if bartab > lim

当程序被GDB停住时,所有的运行线程都会被停住。

而在恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。

8. 查看栈信息

当程序被停住,可以通过查看栈信息来确认执行情况:

backtrace
bt    #函数调用栈
bt <n> #n是正整数,表示只打印栈顶上n层的栈信息
bt <-n> #-n表示一个负整数,表示只打印栈底下n层的栈信息

查看某一层栈的信息:

frame <n>
f  <n>

n是一个从0开始的整数,是栈中的层编号,比如,frame 0表示栈顶,frame 1表示栈的第二层。

up <n>  #表示向栈的上面移动n层,可以不打n,表示向上移动一层。
down <n> #表示向下移动n层。

以下命令不打印出移动的栈层信息:

select-frame <n> 对应于 frame 命令。
up-silently <n> 对应于 up 命令。
down-silently <n> 对应于 down 命令。

输出当前栈层信息的命令:

  • 可以使用info frameinfo f打印出更为详细的当前栈层信息。

  • info args打印当前函数的参数名及其值。

  • info locals打印出当前函数中所有局部变量及其值。

  • info catch 打印出当前的函数中的异常处理信息。

9.显示源代码

编译时需要加上-g参数。

list <[function:]linenum>    #显示程序第linenum行的周围的源程序
list <[filename:]function>    #显示函数名为function的函数的源程序。
list               #显示当前行后面的源程序。
list -            #显示当前行前面的源程序

设置一次显示源代码的行数:

set listsize <count>show listsize    #查看当前listsize的设置

还有以下的选行显示

list <first><last>    #显示从first行到last行之间的源代码
list , <last>·        #显示从当前行到last行之间的源代码
list +                #往后显示源代码
9.1 源码搜索

可搭配正则表达式进行源代码搜索:

forward-search <regexp>
search <regexp>    #向前面搜索reverse-search <regexp>  #全部搜索
9.2 指定源文件的路径
directory <dirname [: dirname2 ....]>
dir <dirname [: dirname2 ....]>show directories #显示定义了的源文件搜索路径
9.3 查看源代码在内存中的地址

打印出所指定的源码在运行时的内存地址:

info line 行业/函数名/文件名:行号/文件名:函数名

查看源程序的当前执行时的机器码,这个命令会把目前内存中的指令dump出来:

disassemble 函数名....
10. 查看运行时数据
print <expr>
print /<f> <expr>

<expr>是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),<f>是输出的格式。

print while(cur)

表达式可支持以下几种操作符:

  1. ::,指定一个在文件或是在一个函数中的变量。

  2. @,一个和数组有关的操作符

  3. {<type>} <addr>,表示一个指向内存地址的类型为type的一个对象。

示例如下:

p 'file'::variable
p function::variable
p "f2.c"::x
p *array@len  #int *array = (int *) malloc (len * sizeof (int));

静态数组直接print数组名即可输出数组内容。

</f>格式有以下几种:

  • x 按十六进制格式显示变量。

  • d 按十进制格式显示变量。

  • u 按十六进制格式显示无符号整型。

  • o 按八进制格式显示变量。

  • t 按二进制格式显示变量。

  • a 按十六进制格式显示变量。

  • c 按字符格式显示变量。

  • f 按浮点数格式显示变量。

示例如下:

(gdb) p /f i
$24 = 1.41531145e-43
10.1 使用examine(x)查看内存地址的值
x [/<n/f/u>] <addr>

可选参数:

  • n,是一个正整数,表示显示内存的长度。

  • f,表示显示的格式,即上面所展示的。

  • u,表示从当前地址往后请求的字节数。默认是4个bytes。以下为预设的几种字符:

    1. b表示单字节

    2. h表示双字节

    3. w表示四字节

    4. g表示八字节

示例:

x/3uh 0x54320

表示从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。

10.2 自动显示

当程序停住时,这些变量可以自动显示。

display <expr>
display /<fmt> <expr>

示例:

display /i $pc  

$pc是GDB的环境变量,表示着指令的地址,/i 输出汇编指令。

删除自动显示:

undisplay <dnums...>
delete display <dnums...>

<dnums>是需要自动显示的变量的序列号。

使用info display可以观察当前所有的自动显示变量,以及它们的序列号。

使用示例:

delete display 2,3  #同时删除序列号2和3对应的自动显示变量
disable display 2,3  #同时失效序列号2和3对应的自动显示变量
enable display 2-5   #同时使能序列号2-5范围内的所有对应自动显示变量
11.设置显示(print)选项

1.打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。系统默认为打开的

set print address on
set print address off

2.打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔。这个选项默认是关闭的。

set print array
set print array on

3.设置数组显示的最大长度以及显示当前print elements的选项信息。

set print elements <number-of-elements>
show print elements

4.当显示字符串时,遇到结束符则停止显示,这个选项默认为off。

set print null-stop <on/off>

5.以漂亮的格式显示结构体等内容。

set print pretty on
set print pretty off

6.设置字符显示,是否按“/nnn”的格式显示

set print sevenbit-strings <on/off>

7.设置显示结构体时,是否显式其内的联合体数据。

set print union <on/off>

8.对象、成员、虚函数等C++类设置

set print object <on/off>   #对对象指针的处理方法

在C++中,如果一个对象指针指向其派生类,如果打开这个选项,GDB会自动按照虚方法调用的规则显示输出,如果关闭这个选项的话,GDB就不管虚函数表了。这个选项默认是off。

set print static-members <on/off>

这个选项表示,当显示一个C++对象中的内容是,是否显示其中的静态数据成员。默认是on。

set print vtbl <on/off>

当此选项打开时,GDB将用比较规整的格式来显示虚函数表时。其默认是关闭的。

11.2 print历史记录

GDB会记录当前运行过程中产生的print记录,并以$1$2$3…这样的方式来编号。

那么就可以使用$1这样的方式来重新输入之前的print表达式。

11.3 GDB环境变量

可以在GDB的调试环境中定义自己的变量,用来保存一些调试程序中的运行数据。

使用以下命令即可定义一个GDB变量:

set $foo = *object_ptr

使用以下命令可以查看当前设置的所有的环境变量。

show convenience

环境变量可以和程序变量交互使用:

set $i = 0
print bar[$i++]->contents
11.4 查看寄存器

使用以下命令即可查看寄存器情况(不包括浮点寄存器):

info registers

以下命令可以包括浮点寄存器:

info all-registers

查看所指定的寄存器的情况:

info registers <regname ...>

也可以使用print命令访问($+寄存器名):

print $sp
12. 查看内存映射信息
12.1 查看虚拟地址映射情况
info proc mapping
12.2 查看动态库加载情况
info sharedlibrary 
12.3 加载特定动态库的符号表

当你在 GDB 中调试一个程序,并且这个程序在运行时加载了动态库,你可以使用 info sharedlibrary 命令查看已加载的动态库及其状态。例如:

(gdb) info sharedlibrary

这将显示所有已加载的动态库及其加载状态。如果某个动态库的符号表还没有加载,你可以使用 sharedlibrary 命令来加载它。例如,如果你想加载所有动态库的符号表,你可以使用:

(gdb) sharedlibrary

如果你只想加载特定动态库的符号表,你可以提供库的名称作为参数。例如,如果你想加载名为 libmylib.so 的库的符号表,你可以使用:

(gdb) sharedlibrary libmylib

请注意,你必须确保 GDB 能找到动态库的符号表。这通常意味着你需要在系统的库路径(例如 /usr/lib/lib)或者 GDB 的库路径(可以使用 set solib-search-path 命令设置)中有动态库的调试版本。







Alt

Once Day

也信美人终作土,不堪幽梦太匆匆......

如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!

(。◕‿◕。)感谢您的阅读与支持~~~

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

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

相关文章

机器学习 | 基本概念梳理——数据集评估,任务,训练和测试,期望结果

文章目录 1 整体概念梳理1.1 数据集与数据术语——原材料1.2 任务术语——目标1.3 训练和测试术语——怎么做1.4 结果——预期期望 整体框架 机器学习的基本概念全梳理 我们通过一个生动形象的例子来介绍这些概念 我们假设有一个任务是根据地理天气等特征位置预测经纬度 1 整…

2023 re:Invent 用 Amazon Q 打造你的知识库

前言 随着 ChatGPT 的问世&#xff0c;我们迎来了许多创新和变革的机会。一年一度的亚马逊云科技大会 re:Invent 也带来了许多前言的技术&#xff0c;其中 Amazon CEO Adam Selipsky 在 2023 re:Invent 大会中介绍 Amazon Q 让我印象深刻&#xff0c;这预示着生成式 AI 的又一…

VUE从0到1创建项目及基本路由、页面配置

一、创建项目:(前提已经安装好vue和npm) 目录:E:\personal\project_pro\ windows下,win+R 输入cmd进入命令行: cd E:\personal\project_pro E:# 创建名为test的项目 vue create test# 用上下键选择vue2或vue3,回车确认创建本次选择VUE3 创建好项目后,使用…

Nginx之rewrite重写功能

一、rewrite概述 1、rewrite功能 访问重写 rewrite 是 Nginx HTTP 请求处理过程中的一个重要功能&#xff0c;它是以模块的形式存在于代码中的&#xff0c;其功能是对用户请求的 URI 进行 PCRE 正则重写&#xff0c;然后返回 30 重定向跳转或按条件执行相关配置。 Nginx服务…

idea 创建打包 android App

1、使用 idea 创建 android 工程 2、 配置构建 sdk 3、配置 gradle a、进入 gradle 官网&#xff0c;选择 install &#xff08;默认是最新版本&#xff09; b、选择包管理安装&#xff0c;手动安装选择下面一个即可 c、安装 sdk 并通过 sdk 安装 gradle 安装 sdk&#xff1a…

软件无线电SDR加人工智能算法实现无人机频谱探测

通用软件无线电接收机作为传感器实时接收探测无线电信号&#xff0c;加上深度学习算法实现频谱识别&#xff0c;(https://img-blog.csdnimg.cn/5a6c4d89a047453a94f763f4e67aeb17.png)

合并果子(哈夫曼树)NOIP2004提高组

在一个果园里&#xff0c;达达已经将所有的果子打了下来&#xff0c;而且按果子的不同种类分成了不同的堆。 达达决定把所有的果子合成一堆。 每一次合并&#xff0c;达达可以把两堆果子合并到一起&#xff0c;消耗的体力等于两堆果子的重量之和。 可以看出&#xff0c;所有…

大话设计模式——3.建造者模式(Builder Pattern)

1.定义&#xff1a; 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。UML图 2.示例&#xff1a; 汽车或者电脑的组装可以采用构造者模式进行设计&#xff0c;如汽车的引擎或者轮胎&#xff0c;电脑的处理器、内存、主板等都可以进行…

flutter简单的MethodChannel通道Demo(引入调用小红书sdk)

flutter端创建MethodChannel类 import package:flutter/services.dart;//MethodChannel const methodChannel const MethodChannel(com.flutter.demo.MethodChannel);class FlutterMethodChannel {/** MethodChannel flutter给原生发信息* 在方法通道上调用方法invokeMethod*…

[开源协议] 什么是MIT协议及其使用场景

什么是MIT协议? MIT协议是一种开放源代码软件授权协议&#xff0c;全称为Massachusetts Institute of Technology License。该协议允许自由地使用、复制、修改、合并、发布、分发、再授权和销售软件及其副本的任何部分。MIT协议要求在软件的所有副本中包含版权声明和许可声明…

高性能API云原生网关 APISIX安装与配置指南

Apache APISIX是Apache软件基金会下的顶级项目&#xff0c;由API7.ai开发并捐赠。它是一个高性能的云原生API网关&#xff0c;具有动态、实时等特点。 APISIX网关可作为所有业务的流量入口&#xff0c;为用户提供了丰富的功能&#xff0c;包括动态路由、动态上游、动态证书、A…

瀑布型还是敏捷型?一次搞懂主数据项目实施方法

在主数据项目实施的过程中&#xff0c;经常会碰到一个让人头痛的问题&#xff0c;我该选择什么样的实施方法才能够更为高效地完成项目的交付&#xff1f; 得帆经过多年在软件行业的摸爬滚打&#xff0c;总结出了适合主数据项目的实施方法。接下来我们将为大家介绍两种常用的实…

gitlab添加ssh公钥

一&#xff1a;生成公钥 桌面鼠标右击打开 Open Git Bash here (前提是安装了Git)&#xff1b; 2.输入命令 ssh-keygen -t rsa -C "123*****90qq.com"来生成新的密钥对,将其中的"123*****90qq.com"替换为你自己的电子邮件地址。 命令&#xff1a;ssh-keyg…

提升Vue3应用效率的秘诀:深入比较ref与reactive!

ref 和 reactive 是 Vue3 中实现响应式数据的核心 API。ref 用于包装基本数据类型&#xff0c;而 reactive 用于处理对象和数组。尽管 reactive 似乎更适合处理对象&#xff0c;但 Vue3 官方文档更推荐使用 ref。 我的想法&#xff0c;ref就是比reactive好用&#xff0c;官方也…

Vue:vue的安装与环境的搭建

文章目录 环境搭建安装node.js&#xff08;比较简单&#xff09;安装Vue脚手架初始化启动 环境搭建 安装node.js&#xff08;比较简单&#xff09; 首先要安装node.js&#xff0c;进入官网下载即可。 更改安装路径&#xff0c;保持默认配置&#xff0c;一直点击下一步安装即可…

(undone) 如何计算 Hessian Matrix 海森矩阵 海塞矩阵

参考视频1&#xff1a;https://www.bilibili.com/video/BV1H64y1T7zQ/?spm_id_from333.337.search-card.all.click 参考视频2&#xff08;正定矩阵&#xff09;&#xff1a;https://www.bilibili.com/video/BV1Ag411M76G/?spm_id_from333.337.search-card.all.click&vd_…

如何电脑录屏?教你3分钟快速掌握!

在当今数字化时代&#xff0c;电脑录屏已成为一项必不可少的技能。无论是录制游戏画面、线上课程还是软件演示&#xff0c;录屏都可以帮助用户更好地保存和分享信息。可是如何电脑录屏呢&#xff1f;在本文中&#xff0c;我们将介绍两种常用的电脑录屏方法&#xff0c;并分步骤…

【nvm切换node版本,发现npm无法使用,简单粗暴的解决方案】

nvm切换node版本&#xff0c;发现npm无法使用&#xff0c;简单粗暴的解决方案 使用了nvm切换指定node版本后&#xff0c;发现npm命令无法使用。 在nodejs官网找到这部分内容 找到需要安装的压缩包 把解压的文件放入到自己的nvm文件夹内 这部分是解压的nodejs 示例

HarmonyOS—低代码开发Demo示例

接下来为大家展示一个低代码开发的JS工程的Demo示例&#xff0c;使用低代码开发如下华为手机介绍列表的HarmonyOS应用/服务示例。 1.删除模板页面中的控件后&#xff0c;选中组件栏中的List组件&#xff0c;将其拖至中央画布区域&#xff0c;松开鼠标&#xff0c;实现一个List组…

Langchain-Chatchat:离线运行的大模型知识库 | 开源日报 No.182

chatchat-space/Langchain-Chatchat Stars: 22k License: Apache-2.0 基于 ChatGLM 等大语言模型与 Langchain 等应用框架实现的开源、可离线部署的检索增强生成 (RAG) 大模型知识库项目。该项目是一个可以实现完全本地化推理的知识库增强方案&#xff0c;重点解决数据安全保护…