0%

转载自开源书籍:《C语言编程透视》,透视C的前世今生!,介绍了GCC编译流程。

  • 预处理
    • 简述
    • 打印出预处理之后的结果
    • 在命令行定义宏
  • 编译(翻译)
    • 简述
    • 语法检查
    • 编译器优化
    • 生成汇编语言文件
  • 汇编
    • 简述
    • 生成目标代码
    • ELF 文件初次接触
    • ELF 文件的结构
    • 三种不同类型 ELF 文件比较
    • ELF 主体:节区
    • 汇编语言文件中的节区表述
  • 链接
    • 简述
    • 可执行文件的段:节区重排
    • 链接背后的故事
    • 用 ld 完成链接过程
    • C++ 构造与析构:crtbegin.o 和 crtend.o
    • 初始化与退出清理:crti.o 和 crtn.o
    • C 语言程序真正的入口
    • 链接脚本初次接触
Read more »

转载自开源书籍:《C语言编程透视》,透视C的前世今生!,主要介绍常用代码优化手段:timecalltreegprofvalgrind等。

目录如下:

  • 代码测试
    • 测试程序的运行时间 time
    • 函数调用关系图 calltree
    • 性能测试工具 gprof & kprof
    • 代码覆盖率测试 gcov & ggcov
    • 内存访问越界 catchsegv, libSegFault.so
    • 缓冲区溢出 libsafe.so
    • 内存泄露 Memwatch, Valgrind, mtrace
  • 代码调试
    • 静态调试:printf + gcc -D(打印程序中的变量)
    • 交互式的调试(动态调试):gdb(支持本地和远程)/ald(汇编指令级别的调试)
    • 嵌入式系统调试方法 gdbserver/gdb
    • 汇编代码的调试 ald
    • 实时调试:gdb tracepoint
    • 调试内核
  • 代码优化
Read more »

使用三方库 Jansson 造成 memory leak,使用 valgrind 分析如下:

$ gcc -O0 -g -ggdb main.c -ljansson                                      
$ valgrind --tool=memcheck --leak-check=full --show-reachable=yes ./a.out

==21533== 4,752 bytes in 1 blocks are definitely lost in loss record 4 of 4
==21533==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==21533==    by 0x4E3F3C4: ??? (in /usr/lib/x86_64-linux-gnu/libjansson.so.4.7.0)
==21533==    by 0x4E3C9F7: json_dumps (in /usr/lib/x86_64-linux-gnu/libjansson.so.4.7.0)
==21533==    by 0x40155F: ipc_db_save (main.c:153)
==21533==    by 0x401C29: main (main.c:287)
==21533== 
==21533== LEAK SUMMARY:
==21533==    definitely lost: 18,480 bytes in 4 blocks
==21533==    indirectly lost: 0 bytes in 0 blocks
==21533==      possibly lost: 0 bytes in 0 blocks
==21533==    still reachable: 0 bytes in 0 blocks
==21533==         suppressed: 0 bytes in 0 blocks
==21533== 
==21533== For counts of detected and suppressed errors, rerun with: -v
==21533== ERROR SUMMARY: 8 errors from 8 contexts (suppressed: 0 from 0)
Read more »

字符数组与字符串

  • 字符串是最后一个字符为 NULL \0 字符的字符数组。字符串一定是字符数组
  • 字符数组,即字符类型的数组。字符数组不一定是字符串
  • 字符数组的长度是固定的,其中的任何一个字符都可以为 NULL 字符
  • 字符串只能以 NULL 结尾,其后的字符便不属于该字符串
  • strlen() 等字符串函数对字符串完全适用,对不是字符串的字符数组不适用,容易出现问题
//这是字符数组赋初值的方法
char cArr[] = {'Q','U','A','N','X','U','E'};
//这是字符串赋初值的方法
char sArr[] = "quanxue";

//用sizeof()求长度
printf("cArr的长度=%d\n", sizeof(cArr));   //长度为7
printf("sArr的长度=%d\n", sizeof(sArr));   //长度为8,最后一位是NULL

//用printf的%s打印内容
printf("cArr的内容=%s\n", cArr);   //不能正确显示
printf("sArr的内容=%s\n", sArr);   //可以正确显示

//用strlen()求长度
printf("cArr的长度=%d\n", strlen(cArr));   //不正确的结果
printf("sArr的长度=%d\n", strlen(sArr));   //NULL不在计算范围
Read more »

常用用法

%s/old/new/g
%s/old/new/gc
%s/\<old\>/new/gc
  • % 所有行
  • g 所有匹配
  • c 替换前确认
  • <> 确认单词边界,需要使用转义符\
Read more »

startuptime

vim 安装大量插件之后导致启动变慢,可以通过以下命令来排查各个插件的启动时间:

vim --startuptime vim.log

vim.log 中保存了启动时间信息:

000.003  000.003: --- VIM STARTING ---                                        
000.068  000.065: Allocated generic buffers                                   
000.092  000.024: locale set                                                  
000.102  000.010: GUI prepared                                                
000.105  000.003: clipboard setup                                             
000.109  000.004: window checked                                              
000.584  000.475: inits 1                                                     
000.588  000.004: parsing arguments                                           
000.589  000.001: expanding arguments                                         
000.595  000.006: shell init                                                  
000.779  000.184: Termcap init                                                
000.810  000.031: inits 2                                                     
000.903  000.093: init highlight                            

Profiling

help cmd

--cmd {command}                        *--cmd*
        {command} will be executed before processing any vimrc file.
        Otherwise it acts like -c {command}.  You can use up to 10 of
        these commands, independently from "-c" commands.
        {not in Vi}

-c {command}    {command} will be executed after the first file has been
        read (and after autocommands and modelines for that file have
        been processed).  "command" is interpreted as an Ex command.
        If the "command" contains spaces, it must be enclosed in
        double quotes (this depends on the shell that is used).
Read more »

git本地新建一个分支后,必须要做远程分支关联。如果没有关联,git会在下面的操作中提示你显示的添加关联。关联目的是如果在本地分支下操作: git pull, git push ,不需要指定在命令行指定远程的分支.推送到远程分支后,你只要没有显示指定,git pull的时候,就会提示你。

跟踪远程分支

使用--set-upstream去跟踪远程分支:

$ git branch --set-upstream
  master
* source
Read more »

SSH 密钥对总是成双出现的,一把公钥,一把私钥。公钥可以自由的放在您所需要连接的 SSH 服务器上,而私钥必须稳妥的保管好。所谓”公钥登录”,原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。这样子,我们即可保证了整个登录过程的安全,也不会受到中间人攻击。

Github下使用多个SSH Key

如果有多个github帐号,当尝试将pc的ssh-key依次加入到不同的github帐号进行commit的时候,会添加失败,提示:

Key is already in use。

SSH公钥使用时相当于用户名密码,不可能两个不同的帐号使用同一个用户名密码。要想在多个GitHub帐号上添加公钥,就要在本地生成多个SSH Keys,每个GitHub帐号对应一个不同的SSH Keys。

一个github帐号下,存在多个 Organization,需要生成多个 SSH Key 进行管理

生成SSH Key

生成SSH Key方法:

ssh-keygen -t rsa -C "mailname1@xxx.com"  
Read more »

使用 requestsbs4 爬取 lyngsat 网页数据,生出数据库,或导出为 Excel。期间遇到一些问题,记录如下:

Read more »

kernel启动调用流程:
start_kernel -> rest_init -> kernel_thread -> init -> do_basic_setup -> do_initcalls

Read more »

分两种情况:

  1. 代码仓库管理者给你添加该仓库的写入权限,这样的话可以直接push
  2. 如果不能直接push(大多数情况),采用经典的 fork & pull request 来提交代码,下面讲述这种情况
Read more »

bash echo

T='gYw'   # The test text                                                      

echo -e "\n                 40m     41m     42m     43m\                       
    44m     45m     46m     47m";                                              

for FGs in '    m' '   1m' '  30m' '1;30m' '  31m' '1;31m' '  32m' \           
    '1;32m' '  33m' '1;33m' '  34m' '1;34m' '  35m' '1;35m' \                  
    '  36m' '1;36m' '  37m' '1;37m';                                           
  do FG=${FGs// /}                                                             
      echo -en " $FGs \033[$FG  $T  "                                          
      for BG in 40m 41m 42m 43m 44m 45m 46m 47m;                               
      do echo -en "$EINS \033[$FG\033[$BG  $T  \033[0m";                                                                           
      done                                                                     
      echo;                                                                    
  done                                                                         
  echo                          
Read more »

:help filename-modifiers
:help fnamemodify
:help extend

examples

Examples, when the file name is "src/version.c", current dir                  
"/home/mool/vim":                                                             

    :p                    /home/mool/vim/src/version.c                          
    :p:.                                 src/version.c                          
    :p:~                           ~/vim/src/version.c                          
    :h                                   src                                    
    :p:h                  /home/mool/vim/src                                    
    :p:h:h                /home/mool/vim                                        
    :t                                       version.c                          
    :p:t                                     version.c                          
    :r                                   src/version                            
    :p:r                  /home/mool/vim/src/version                            
    :t:r                                     version                            
    :e                                               c                          
    :s?version?main?                     src/main.c                                                                                  
    :s?version?main?:p    /home/mool/vim/src/main.c                             
    :p:gs?/?\\?           \home\mool\vim\src\version.c      
Read more »