首页 > 其他分享 >qemu中的glib库api试用--Apple的学习笔记

qemu中的glib库api试用--Apple的学习笔记

时间:2023-09-09 16:06:07浏览次数:39  
标签:glib Apple -- t1 usr linux libglib 2.0

一,前言

qemu中有些glib库的api,我想学习试用下。

二,编译及调试

1.      使用glib库后编译报错,缺少头文件

root@ubuntu:/work/study# gcc t1.c -o t1
t1.c:2:18: fatal error: glib.h: No such
file or directory
 #include <glib.h>
                  ^
compilation terminated.

2.      搜索glib.h的头文件路径

root@ubuntu:/work/study# locate glib.h
/mnt/hgfs/sharevm/nuttx/apache-nuttx-10.0.1-incubating.tar/apache-nuttx-10.0.1-incubating/nuttx/graphics/nxglib/nxglib.h
/mnt/hgfs/sharevm/nuttx/apache-nuttx-10.0.1-incubating.tar/apache-nuttx-10.0.1-incubating/nuttx/include/nuttx/nx/nxglib.h
/usr/include/glib-2.0/glib.h
/usr/src/linux-headers-4.4.0-142-generic/include/config/blk/dev/bsglib.h

找到路径是/usr/include/glib-2.0

3.      然后想到还有其他路径或库路径,最简单的是用pkg-config来搜索自定路径,先看看路径吧

root@ubuntu:/work/study# pkg-config
--cflags --libs glib-2.0
-I/usr/include/glib-2.0
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include 
-lglib-2.0

4.  编译命令修改为

gcc `pkg-config --cflags --libs glib-2.0`  t1.c -o t1,结果报错,有一堆undefined,难道库路径不正确,奇怪

t1.c:(.text+0x42): undefined reference to `g_free'

4.      查库路径下是否有函数定义

root@ubuntu:/work/study# nm -D
/usr/lib/x86_64-linux-gnu/libglib-2.0.so|grep g_hash_table_new_full
0000000000038150 T g_hash_table_new_full

看上去有函数定义的。难道makefile链接的是同名的其它路径

5.      搜索libglib-2.0.so的路径

root@ubuntu:/work/study# locate
libglib-2.0.so
/lib/x86_64-linux-gnu/libglib-2.0.so.0
/lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0
/usr/lib/vmware-tools/lib32/libglib-2.0.so.0
/usr/lib/vmware-tools/lib32/libglib-2.0.so.0/libglib-2.0.so.0
/usr/lib/vmware-tools/lib64/libglib-2.0.so.0
/usr/lib/vmware-tools/lib64/libglib-2.0.so.0/libglib-2.0.so.0
/usr/lib/x86_64-linux-gnu/libglib-2.0.so

作为默认路径/usr/lib下就这么一个库,怎么回事,后来搜索其它人用pkg-config的用法,原来位置要放.c后面

6.      修改命令为gcc t1.c `pkg-config --cflags --libs glib-2.0` -o t1后编译通过。

7.      运行后就core dumped了

root@ubuntu:/work/study# ./t1
hash num:5
key:1, value:test1
*** Error in `./t1': munmap_chunk():
invalid pointer: 0x0000000000400c4f ***
Aborted (core dumped)

8.      先要支持生成coredump

ulimit -c unlimit

9.     Coredump的路径查看

root@ubuntu:/work/study# cat /proc/sys/kernel/core_pattern
|/usr/share/apport/apport %p %s %c %d %P

10.   coredump的路径修改(此为临时修改法,复位后就没了)

echo "/tmp/cores/core.%e.%p.%h.%t" > /proc/sys/kernel/core_pattern

然后在tmp文件夹下创建cores文件夹即可。

就会看到生成了core文件。

cp core.t1.2779.ubuntu.1694238626 /work/study/

11.   在temp/cores下有dump的文件,在本地路径也有。用gdb调试core文件

输入命令gdb ./t1 core.t1.2779.ubuntu.1694238626

然后bt

Using host libthread_db library
"/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./t1'.
Program terminated with signal SIGABRT,
Aborted.
#0 
0x00007f0577140c37 in __GI_raise (sig=sig@entry=6)
   
at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56    ../nptl/sysdeps/unix/sysv/linux/raise.c:
No such file or directory.
(gdb) bt
#0 
0x00007f0577140c37 in __GI_raise (sig=sig@entry=6)
   
at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1 
0x00007f0577144028 in __GI_abort () at abort.c:89
#2 
0x00007f057717d2a4 in __libc_message (do_abort=do_abort@entry=1, 
   
fmt=fmt@entry=0x7f057728f350 "*** Error in `%s': %s: 0x%s
***\n")
   
at ../sysdeps/posix/libc_fatal.c:175
#3 
0x00007f0577188007 in malloc_printerr (action=<optimized out>, 
   
str=0x7f057728f6d0 "munmap_chunk(): invalid pointer",
ptr=<optimized out>)
   
at malloc.c:4998
#4 
0x00007f057750a840 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#5 
0x00007f057750adfa in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#6 
0x0000000000400b65 in main ()
(gdb)

基本上看出munmap_chunk函数后就出问题了。

12.   然后去看源码,根据print的log信息基本上认为是删除动作出问题,然后看了qemu的用法,创建的时候最后2个是NULL,改成NULL就通过了。

所以我猜测这个glib版本有缺陷。

13.   内存检查看下

valgrind --leak-check=full ./t1

qemu中的glib库api试用--Apple的学习笔记_glib

所以若无qemu中的用法对比,然后结合print的信息,也可以猜到和free相关的错误,就是g_hash_table_new_full中的参数。

三,输出物

qemu中的glib库api试用--Apple的学习笔记_glib_02

四,小结

没想到就用几个api,过程还比较坎坷,不过正好让我复习下基于linux的debug技术。但是这也体现了一个问题,就是用库的过程中库若错误,真是又多了一个工作量,问题严重的话,可能还要去排查库的源码呢~


标签:glib,Apple,--,t1,usr,linux,libglib,2.0
From: https://blog.51cto.com/u_16247275/7419784

相关文章

  • 虚化及信息安全学习历程--Apple的学习笔记
    一,前言先做了一个基本方向的定义,然后我就开始玩qemu,基于qemu做二次开发。在学习qemu的过程中主要学习hypervisor,然后再学习信息安全相关内容。二,过程记录tbd三,新路历程2023/09/01:开学咯,之前的blog我写了5年,由于不好用,所以我换了blog同时也换了新的学习大方向,正好再来一个5年。 ......
  • 图文带你了解华为华三路由器交换机登录的几种方法(开局必备)
    作者:网络之路一天 首发公众号:网络之路博客(ID:NetworkBlog)前言我们学习路由交换就是在实际工作中来配置,解决客户或者上级给的需求,真正接触的就是实实在在的路由器跟交换机,当拿到一套全新的设备的时候,要知道如何去登录,以及一些注意的事项,这个比较关键,很多初学者用惯了模拟器,而模拟器......
  • kubectl 命令详解(十七):create configmap
    一、命令作用根据配置文件、目录或指定的literal-value创建configmap。configmap用来保存一个或多个key/value信息。当基于配置文件创建configmap时,key将默认为文件的基础名称,value默认为文件文本内容。如果基本名称的key无效,则可以指定另一个key。当基于目录创建config......
  • 服务器上安装kubectl
    1、登录服务器2、创建~/.kube文件夹3、cd~/.kube4、下载或创建k8s集群的config文件:wget config文件连接apiVersion:v1kind:Configclusters:-cluster:api-version:v1insecure-skip-tls-verify:trueserver:"https://172.172.241.170:8080/r/projects/1a9/......
  • Spring boot与Spring cloud 之间的关系
    Springboot与Springcloud之间的关系Springboot是Spring的一套快速配置脚手架,可以基于springboot快速开发单个微服务,SpringBoot,看名字就知道是Spring的引导,就是用于启动Spring的,使得Spring的学习和使用变得快速无痛。不仅适合替换原有的工程结构,更适合微服务开发。Spring......
  • B站拍视频的步骤计划
    对于一个没有从事过的事情,最好的方式就是模仿。所以想要通过发表视频牟利,就去关注一些其他的up主。第一个粉丝量大,第二个就是视频拍摄比较简单。峰哥亡命天涯的视频,主要是拍摄一些人物的生活经历,这些经历往往超出了一般人的生活经验,所以会吸引很多的点击量和播放。比如龙华富士康躺......
  • java详细安装教程(供参考)一一java(jdk)安装
    一、java历史简介1991年Sun公司的JamesGosling等人开始开发名称为Oak(橡树)的语言。希望用于控制嵌入在有线电视交换盒、PDA等的微处理器,1994年将Oak语言更名为Java1998年JDK1.2时,更名为Java2Platform分为标准版J2SE,企业版J2EE,微型版J2MEJava既安全、可移植,又可跨平台,而且人......
  • 设置一台新服务器允许root用户登录
    操作如下:1.使用ubuntu用户登陆2.运行sudopasswdroot 要求输入密码和确认密码3.sudovi/etc/ssh/sshd_config修改ssh配置找到 #PermitRootLoginprohibit-password修改为 PermitRootLoginyes按esc:wq!保存退出4.重启ssh服务sudoservicesshrestart......
  • 玩转WeBASE七大使用场景
    WeBASE是一个体验友好、功能丰富的区块链中间件平台,通过一系列通用功能组件和实用工具,助力开发者快速搭建区块链应用的基础环境,并提供可视化合约IDE和一站式联盟链管理台。为什么需要WeBASEFISCOBCOS自2017年开源以来,大量开发者基于FISCOBCOS开发区块链应用。在和开发者的日常沟......
  • Progress 圆形进度条 实现
    效果图实现过程分析简要说明本文主要以TypeScript+React为例进行讲解,demo中使用到了sass,但用法相对简单,不影响理解HTMLDOM元素说明<divclassName="g-progress-wrap"><divclassName="g-progress"></div><divclassName="g-circle">......