分类 Window 下的文章

C++: 在Visual Studio里利用pdb文件进入lib调试方法


1. 基础知识

静态库和动态库

首先说一下,库的导出分为静态库和动态库。
20210701152123277.png

导出静态库的话,会生成一个.lib文件,其实就是.obj的集合,.obj又是.cpp编译得到的,所以,静态库里有函数的实现。不过这些实现是二进制的,是不带源码的。使用静态库的时候,需要链接.lib,包含.h。

导出动态库的话,会生成.dll文件和.lib文件,动态库生成的.lib文件会很小,因为这里的.lib只需要指明函数在.dll中的位置就可以了。使用的时候,需要把.dll和程序将要生成的.exe放在一个位置(双击exe运行),或者放在“调试 - 工程目录”指定的位置(在IDE中运行)。当然,如果你把“调试 - 工程目录“设置成$(OutDir),就和exe的输出位置一致了,调试也能运行,双击exe也能运行。

符号文件.pdb

.pdb文件就是所谓的符号文件。在库的编译过程中一同产生,pdb的生成位置和文件名由“链接器 - 调试 - 生成程序数据库文件”决定。这个名字是会写进.dll的,也可以和.dll的名字不一样。例如,dll的名字是a.dll,生成时的符号文件是b.pdb,你在调试时把b.pdb强行改成a.pdb,调试器是不认的。所以,为了调试方便不混淆,我建议把.pdb的文件名设置成和.dll一样。否则debug版和release版的pdb都一个名字,就无法区分了。

.pdb文件里面记载了函数名称和对应的.cpp文件名称,.cpp文件的md5信息。所谓“符号文件”,就是在你调试时用来查找函数对应于哪个.cpp文件哪一行的,好告知调试器跳转过去。
2021070115362282.png

2. 加载符号

现在假设你已经有一个工程了,可以编译运行。你调用了在.lib中的函数,下了断点,按F11想要步入。

这时有两种情况,第一种是你直接跳转到库的源码了。这里的原理很简单,因为你的pdb已经加载(你把pdb放在调试目录了),pdb里记载了函数所在的cpp,而这个库是你在本机编译的,绝对路径没有改动,调试器直接就找到了对应的cpp,所以就直接跳转了。

而第二种情况,按F11并不能进入到源码,而是直接步过了。如果想进入.lib的源码,需要怎么做呢?

首先需要准备.pdb文件,还有库的源码。

之后要检查符号是否加载。下断点,F5调试。然后“<font color=red>调试 - 窗口 - 模块</font>”打开模块窗口。

20210701153351397.png

找到第三方dll的名字,我这里是DuiLib_ud.dll,看“符号文件”一栏是空的。说明这个dll的符号文件没有加载。

把.pdb和.dll放在一起。

20210701154550416.png

再次调试。可以看到符号文件已经加载了。

20210701154633902.png

其实不和dll放一起也可以。“工具 - 选项 - 符号”,在符号文件位置下面增加路径也可以。不过我不喜欢改动没有移植性的环境选项,更喜欢凡事都用相对路径。顺带一提,通过上面的模块界面,可以加载系统dll的符号文件,调试时可以进入系统dll的汇编。

20210701154723632.png

3. 加载源码

现在符号文件已经加载了。再次开始调试,在断点处按F11步入。弹出了查找源码的选项。

20210701155426186.png

在这里你就可以手动指定源码的位置了,不用担心版本出错,有md5校验的,你指定的.cpp如果不是这个库当初生成时的.cpp是通不过的。

不过我不喜欢这种硬编码绝对路径的做法,不优雅。我们点取消,就会看见未找到XXX.cpp界面。展开“源搜索信息”,可以看到调试器都从哪些地方在寻找这个.cpp文件。记住这个界面,如果我们之后指定.cpp路径时不正确,可以在这里来查看。

20210701155713480.png

之后,把库的源码复制到我们自己的工程目录里。工程文件什么的不用带,只需要.cpp就可以了,理论上.h都不需要。

20210701161411580.png

之后,在解决方案上右键“属性”,注意是解决方案上右键,不是工程。选择“通用属性 - 调试源文件”,在“包含源代码的目录”里增加我们刚拷进来的库的源代码目录。

20210701161439586.png

微软说这里的查找源文件功能是不能识别子目录的,所有子目录都要手动加进来。

这里修改了之后,我实验发现要重启VS才生效。再次调试,可以进到库的源码了。在库的源码上悬停,我这里是在UIBase.cpp上悬停,可以看到它找到的源码的文件路径。确认是找到了我们刚放进去的源码。

20210701161729269.png

本来我还想实验一下。我改了lib_src文件夹的名字,发现它还是能找到源码;我删掉debug文件夹下的内容,它还是能找到;我删掉和exe一块儿生成的.ilk和.pdb,它还是能找到;我删掉.vs隐藏文件夹,它还是能找到;我改动工程路径,它还是能找到。

这就很迷茫了。总之,也许它找到一次之后,查找文件功能就突然逆天了,知道寻找解决方案下面的所有cpp文件吧。

参考

如何调试静态库的代码(libeay32.lib和ssleay32.lib)

在 Visual Studio 调试器(C#、C++、Visual Basic、F#)中指定符号 (.pdb) 和源文件


C/C++: 命令行下的软件安装进度条


前言

我们在平时的服务器运维工作中,要经常安装一些软件,经常会看到下面这种进度条,咱们就用C语言来实现这种进度条。

相关知识

  1. 用fflush函数强行让屏幕刷新。
  2. printf格式控制
  3. stdout即屏幕的文件流

截图

cmd_loading.gif

程序代码包

cmd_loading.zip

相关代码

#include <stdio.h>
#include <string.h>
#include <ctime>
#include <windows.h>        // window下用Sleep
// #include <unistd.h>      // linux下用sleep

void loader(int rate)
{
    char proc[102];
    memset(proc, '\0', sizeof(proc));
    
    for (int i = 0; i < rate; i++)
    {
        proc[i] = '#';
    }
    
    printf("[%-100s] [%d%%]\r", proc, rate);        //C语言格式控制时默认右对齐,所以要在前面加-变成左对齐
    fflush(stdout);                                 //刷新屏幕打印
}

int main()
{
    int i = 0;
    while(i <= 100)    
    {
        loader(i);
        Sleep(200);                                 //以微秒为单位的sleep
        i++;  
    }
    return 0;
}

Window: wsappx搞事情,把磁盘占用到100%,禁用此服务!


事情的缘由

所里的电脑突然间卡的要死,看了眼任务管理器,磁盘占用100%,再一找,是个wxappx个东西一直在往盘里写东西,不知道干啥呢,直接停掉吧,要不一时半会占用下不来。

解决办法

win+R -> regedit 进注册表
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\AppXSvc
点击start
把3改成4

最后重启一下就可以了


HDF5: 介绍


一、HDF5简介

HDF 是用于存储和分发科学数据的一种自我描述、多对象文件格式。HDF 是由美国国家超级计算应用中心(NCSA)创建的,以满足不同群体的科学家在不同工程项目领域之需要。HDF 可以表示出科学数据存储和分布的许多必要条件。HDF 被设计为:

  1. 自述性:对于一个HDF 文件里的每一个数据对象,有关于该数据的综合信息(元数据)。在没有任何外部信息的情况下,HDF 允许应用程序解释HDF文件的结构和内容。
  2. 通用性:许多数据类型都可以被嵌入在一个HDF文件里。例如,通过使用合适的HDF 数据结构,符号、数字和图形数据可以同时存储在一个HDF 文件里。
  3. 灵活性:HDF允许用户把相关的数据对象组合在一起,放到一个分层结构中,向数据对象添加描述和标签。它还允许用户把科学数据放到多个HDF 文件里。
  4. 扩展性:HDF极易容纳将来新增加的数据模式,容易与其他标准格式兼容。
    跨平台性:HDF 是一个与平台无关的文件格式。HDF 文件无需任何转换就可以在不同平台上使用。

1. HDF5的组织结构

  • File 文件。相当于根目录
  • Groups 组。类似于文件夹
  • Datasets 数据集。数据的集合
  • Dataspace 数据空间给出原始数据的秩 (Rank) 和维度 (dimension)
  • Datatype 数据类型
  • Properties 说明该 dataset 的分块储存以及压缩情况
  • Chunked: 待摸索
  • Chunked & Compressed: 待摸索
  • Attributes 为该 file/gourps/dataset 的其他自定义属性

hdf5_1.jpg
hdf5_2.jpg
hdf5_3.jpg

2. 相关网站

HDF5官网
HDF5 View 下载地址
HDF5 相关下载地址
官方文档地址

二、HDF5下载与安装

1. cmake形式引入

待完善

2. window下安装

下载官方安装包直接安装或下载下方压缩包(官网下载需要登录,内陆访问很慢)

hdf5-1.12.1-Std-win10_64-vs16.zip

3. linux下安装

待完善


TensorFlow: 环境安装(win+python+TensorFlow+CUDA+CUDNN)


需求

在家呆的时间打算学习一下AI,在网上查了挺多机器学习的,最后选择了TensorFlow。主要目的是给自己生成一套神经网络,留着以后用。

基础

本身电脑Win10 1660显卡一张。

环境

Python: 3.8.1
TensorFlow-GPU: 2.6.0
CUDA: 11.4.1
CUDNN: 11.4

环境安装过程

  1. Python

python是开发人员的必备品,已经安装过了,这里就不做介绍了,自行百度。

  1. TensorFlow-GPU

开源的计算机学习平台,安装比较简单,python下的pip可直接安装:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade tensorflow-gpu

命令解析:

pip python包管理器
install 安装
-i 临时指定安装源,这里选的是清华的源,要不下载太慢
--upgrade 顺带更新
tensorflow-gpu 软件包名称

微信图片_20210905193133.png
微信图片_20210905193204.png

然后尝试使用tensorflow,python命令行模式下引入此库。

import tensorflow as tf

没有安装CUDA和CUDNN的情况下会出现报错,如下图:
微信图片_20210905193427.png

  1. 安装CUDA
    进入英伟达开发者中心下载:CUDA Toolkit Archive阿里云盘

下载后点击会先把安装文件解压到指定目录,之后才会真正的安装。

安装图示:
微信图片_20210905193821.png
微信图片_20210905193826.png

  1. 安装CUDNN
    进入英伟达开发者中心下载:cuDNN Archive

下载后需要解压到CUDA的安装目录中。
微信图片编辑_20210905194212.jpg

  1. 环境变量配置
    右键此电脑-》高级系统设置(右边小字)-》高级-》环境变量-》系统变量Path

微信图片编辑_20210905195206.jpg

检查变量

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\libnvvp
C:\Program Files\NVIDIA Corporation\Nsight Compute 2021.2.1\
// C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\lib\x64

头三个是安装完CUDA时候自动添加,最后一个需要手动添加
微信图片编辑_20210905195350.jpg

最后所有环境处理完毕,入门就是Hello World

代码:

import tensorflow.compat.v1 as tf   #解决 module ‘tensorflow’ has no attribute ‘Session’
#import tensorflow as tf

tf.compat.v1.disable_eager_execution()  #解决报错:runtimeerror: the session graph is empty. add operations to the graph before calling run()
hello = tf.constant('Hello world')

sess = tf.Session()

with tf.Session() as sess:
    print(sess.run(hello).decode())

sess.close()

微信图片编辑_20210905201356.jpg