<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Debug on kamuszhou&#39;s blog</title>
    <link>https://ykyi.net/tags/debug/</link>
    <description>Recent content in Debug on kamuszhou&#39;s blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Thu, 13 Feb 2014 08:02:43 +0000</lastBuildDate>
    <atom:link href="https://ykyi.net/tags/debug/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>怎么知道gcc搜索头文件的路径</title>
      <link>https://ykyi.net/?p=1187/</link>
      <pubDate>Thu, 13 Feb 2014 08:02:43 +0000</pubDate>
      <guid>https://ykyi.net/?p=1187/</guid>
      <description>&lt;p&gt;&lt;font size=&#34;3&#34;&gt;每个C/C++程序员都知道，对于#include directive，一般，以双引号引用的头文件是程序号自定义的头文件。而用尖括号引用的头文件是系统的头文件或其它库文件。&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&#34;3&#34;&gt;更详细的，编译器先在当前目录找用双引号&amp;quot;&amp;ldquo;引用的头文件，如果找不到再到系统目录找这个头文件。而对于尖括号引用的头文件，编译器就只在系统文件中搜索了。&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&#34;3&#34;&gt;那么，到底是在哪些目录中搜索头文件呢？&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&#34;3&#34;&gt;可以用cpp查看，如下：&lt;/font&gt;&lt;/p&gt;
&lt;pre class=&#34;brush:other&#34;&gt;root@vicarious:/home/kamus/projs/horoscope/boost# cpp -v
Using built-in specs.
COLLECT_GCC=cpp
Target: x86_64-linux-gnu
Thread model: posix
gcc version 4.7.2 (Debian 4.7.2-5)
COLLECT_GCC_OPTIONS=&amp;#39;-E&amp;#39; &amp;#39;-v&amp;#39; &amp;#39;-mtune=generic&amp;#39; &amp;#39;-march=x86-64&amp;#39;
 /usr/lib/gcc/x86_64-linux-gnu/4.7/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu - -mtune=generic -march=x86-64
ignoring nonexistent directory &#34;/usr/local/include/x86_64-linux-gnu&#34;
ignoring nonexistent directory &#34;/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include&#34;
#include &#34;...&#34; search starts here:
#include &amp;lt;...&amp;gt; search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/4.7/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;font-size:16px;&#34;&gt;一般编写makefile时给gcc指定 -I选项，-I的参数代表的目录是搜索系统头文件时使用的目录。可以试试# cpp -I/tmp -v &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;font-size:16px;&#34;&gt;/tmp目录会被添加为搜索系统头文件时的第一个目录。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;font-size:16px;&#34;&gt;如果想要添加搜索双引号&amp;quot;&amp;ldquo;引用的头文件使用的目录呢，用 &lt;strong&gt;-iquote&lt;/strong&gt; 选项指定更多的目录。&lt;/span&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux的环境变量LD_DEBUG调试so的加载</title>
      <link>https://ykyi.net/?p=1185/</link>
      <pubDate>Wed, 12 Feb 2014 07:20:25 +0000</pubDate>
      <guid>https://ykyi.net/?p=1185/</guid>
      <description>&lt;p&gt;&lt;em style=&#34;line-height: 1.6em;&#34;&gt;一个稍微有经验的&lt;/em&gt;&lt;em style=&#34;line-height: 1.6em;&#34;&gt;Linux&lt;/em&gt;&lt;em style=&#34;line-height: 1.6em;&#34;&gt;程序员都知道使用&lt;/em&gt;&lt;em style=&#34;line-height: 1.6em;&#34;&gt;LD_LIBRARY_PATH&lt;/em&gt;&lt;span style=&#34;line-height: 1.6em;&#34;&gt; 来临时设置加载器搜索动态链接库so的路径顺序。但另一个不为人知的环境变量是LD_DEBUG。这个变量可以提供非常详细的加载动态链接库的信息。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;可以把LD_DEBUG设成以下值：&lt;/p&gt;
&lt;p&gt;export LD_DEBUG=files     # 显示库的依赖性和加载的顺序&lt;/p&gt;
&lt;p&gt;export LD_DEBUG=bindings  # 符号绑定&lt;/p&gt;
&lt;p&gt;export LD_DEBUG=libs   # 显示加载器查找库时使用的路径的顺序&lt;/p&gt;
&lt;p&gt;export LD_DEBUG=versions  # 版本依赖性&lt;/p&gt;
&lt;p&gt;export LD_DEBUG=help  # LD_DEBUG的帮助信息&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;试一下把LD_DEBUG设成以上值之一，再随便运行一个程序试试。&lt;/p&gt;
&lt;p&gt;一个试验：&lt;/p&gt;
&lt;pre class=&#34;brush:other&#34;&gt;root@vicarious:/home/kamus/projs/horoscope/bins# export LD_DEBUG=libs

root@vicarious:/home/kamus/projs/horoscope/bins# vim my.conf

     24360:   find library=libm.so.6 [0]; searching

     24360:   search cache=/etc/ld.so.cache

     24360:     trying file=/lib/x86_64-linux-gnu/libm.so.6

     24360:

     24360:   find library=libtinfo.so.5 [0]; searching

     24360:   search cache=/etc/ld.so.cache

     24360:     trying file=/lib/x86_64-linux-gnu/libtinfo.so.5

     24360:

     24360:   find library=libselinux.so.1 [0]; searching

     24360:   search cache=/etc/ld.so.cache

     24360:     trying file=/lib/x86_64-linux-gnu/libselinux.so.1

     24360:

     24360:   find library=libacl.so.1 [0]; searching

     24360:   search cache=/etc/ld.so.cache

     24360:     trying file=/lib/x86_64-linux-gnu/libacl.so.1

     24360:

     24360:   find library=libgpm.so.2 [0]; searching

     24360:   search cache=/etc/ld.so.cache

     24360:     trying file=/usr/lib/x86_64-linux-gnu/libgpm.so.2

     24360:

     24360:   find library=libc.so.6 [0]; searching

     24360:   search cache=/etc/ld.so.cache

     24360:     trying file=/lib/x86_64-linux-gnu/libc.so.6

     24360:

     24360:   find library=libdl.so.2 [0]; searching

     24360:   search cache=/etc/ld.so.cache

     24360:     trying file=/lib/x86_64-linux-gnu/libdl.so.2

     24360:

     24360:   find library=libattr.so.1 [0]; searching

     24360:   search cache=/etc/ld.so.cache

     24360:     trying file=/lib/x86_64-linux-gnu/libattr.so.1&lt;/pre&gt;
&lt;p&gt;copyright ykyi.net&lt;/p&gt;</description>
    </item>
    <item>
      <title>为什么dump生成core文件大小是0</title>
      <link>https://ykyi.net/?p=1099/</link>
      <pubDate>Wed, 25 Dec 2013 05:17:38 +0000</pubDate>
      <guid>https://ykyi.net/?p=1099/</guid>
      <description>&lt;p&gt;今天程序崩溃了，但是生成的core文件大小是0.&lt;/p&gt;
&lt;p&gt;用ulimit -c 查看生成core文件的大小限制是无限unlimited.&lt;/p&gt;
&lt;p&gt;也不是磁盘大小和写入权限的问题。&lt;/p&gt;
&lt;p&gt;但究竟是什么问题呢？&lt;/p&gt;
&lt;p&gt;捣了半天终于搞明白，原来是文件系统造成的。&lt;/p&gt;
&lt;p&gt;我是在vmware的虚拟机的debian linux上运行程序，文件系统用的是从host机windows 7挂载到/mnt/hgfs的windows的NTFS文件系统。&lt;/p&gt;
&lt;p&gt;后来我把程序转移动linux自己的文件系统，崩溃的时候就生成正常的core dump文件了。&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;color: rgb(0, 0, 0); font-family: Verdana, Geneva, sans-serif; font-size: 16px; line-height: 22px; background-color: rgb(244, 244, 244);&#34;&gt;copyright ykyi.net&lt;/span&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>CDT调试中的追踪点和断点有什么区别。</title>
      <link>https://ykyi.net/?p=1077/</link>
      <pubDate>Wed, 11 Dec 2013 02:31:13 +0000</pubDate>
      <guid>https://ykyi.net/?p=1077/</guid>
      <description>&lt;p style=&#34;margin: 0.4em 0px 10px; line-height: 24px; color: rgb(0, 0, 0); font-family: Arial, sans-serif; font-size: medium;&#34;&gt;
  追踪点（Tracepoint）被当成断点(breakpoint)的一种，但有两个不同点需要注意：
&lt;/p&gt;
&lt;p style=&#34;margin: 0.4em 0px 10px; line-height: 24px; color: rgb(0, 0, 0); font-family: Arial, sans-serif; font-size: medium;&#34;&gt;
  1. 当一个追踪点在一个调试会话中被创建时，它并不种入到二进制代码中，直到用户显式地开始追踪实验。这意味着，创建/修改/删除追踪点并不影响程序，直到追踪真正开始。
&lt;/p&gt;
&lt;p style=&#34;margin: 0.4em 0px 10px; line-height: 24px; color: rgb(0, 0, 0); font-family: Arial, sans-serif; font-size: medium;&#34;&gt;
  2. 简单的创建一个追踪点并不是非常有价值，因为它默认不会收集任何信息。重要的是，把操作(Actions)添加到Tracepoint，这样tracepoint被触发的时候，前面自定义的Action就大有用处了。
&lt;/p&gt;
&lt;p style=&#34;margin: 0.4em 0px 10px; line-height: 24px; color: rgb(0, 0, 0); font-family: Arial, sans-serif; font-size: medium;&#34;&gt;
  来自CDT官网的原文：
&lt;/p&gt;
&lt;p style=&#34;margin: 0.4em 0px 10px; line-height: 24px; color: rgb(0, 0, 0); font-family: Arial, sans-serif; font-size: medium;&#34;&gt;
  &lt;b&gt;Create Tracepoints&lt;/b&gt;
&lt;/p&gt;</description>
    </item>
    <item>
      <title>让eclipse自动生成的注释的时间显示英文，不用中文.</title>
      <link>https://ykyi.net/?p=1074/</link>
      <pubDate>Mon, 09 Dec 2013 08:21:55 +0000</pubDate>
      <guid>https://ykyi.net/?p=1074/</guid>
      <description>&lt;p&gt;&lt;span style=&#34;font-size:16px;&#34;&gt;这几天换成用eclipse在windows机器上编写代码，远程运行在linux上，并且在windows机器上远程调试。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;font-size:16px;&#34;&gt;新建一个C++类的时候，eclipse/CDT自动生成注释，注释的时间用了中文，并且用的注释风格也不是我想要的。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&#34;3&#34;&gt;但我想全部用英文，这个如何解决了。在stackoverflow上找到了答案，并试验成功。&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&#34;3&#34;&gt;windows -&amp;gt; preferences -&amp;gt; c/c++ -&amp;gt; code style -&amp;gt; code template&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;font-size:16px;&#34;&gt;在右边的注释模板中编辑File Comment，改成你想要的模式。比如我的：&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/*&lt;strong&gt;*&lt;/strong&gt;*&lt;strong&gt;*&lt;/strong&gt;*&lt;strong&gt;*&lt;/strong&gt;*&lt;strong&gt;*&lt;/strong&gt;*&lt;strong&gt;*&lt;/strong&gt;*&lt;strong&gt;*&lt;/strong&gt;*&lt;strong&gt;*&lt;/strong&gt;***&lt;br&gt;
 * ${file_name}&lt;br&gt;
 * Author: ${user}&lt;br&gt;
 * Created on: ${date}&lt;br&gt;
 *&lt;strong&gt;*&lt;/strong&gt;*&lt;strong&gt;*&lt;/strong&gt;*&lt;strong&gt;*&lt;/strong&gt;*&lt;strong&gt;*&lt;/strong&gt;*&lt;strong&gt;*&lt;/strong&gt;*&lt;em&gt;&lt;strong&gt;&lt;span style=&#34;line-height: 1.6em;&#34;&gt;&lt;/strong&gt;&lt;/em&gt;*******/&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;再在eclipse的安装目录上找到eclipse.ini文件，加入：-Duser.language=en_US&lt;/p&gt;
&lt;p&gt;重启eclipse。现在${date}变量生产的日期就是全英文了。&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;color: rgb(0, 0, 0); font-family: Verdana, Geneva, sans-serif; font-size: 16px; line-height: 22px;&#34;&gt;copyright ykyi.net&lt;/span&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何从windows远程调试linux程序。</title>
      <link>https://ykyi.net/?p=1059/</link>
      <pubDate>Wed, 04 Dec 2013 03:29:06 +0000</pubDate>
      <guid>https://ykyi.net/?p=1059/</guid>
      <description>&lt;p class=&#34;p0&#34; data-mce-style=&#34;margin-top: 0pt; margin-bottom: 0pt; padding: 0px; border: 0px; font-size: 12px; font-family: Verdana, Geneva, sans-serif; vertical-align: baseline; line-height: 12pt; color: #000000; background-color: #f4f4f4;&#34; style=&#34;unicode-bidi: embed; margin: 0pt 0px; padding: 0px; border: 0px; font-family: Verdana, Geneva, sans-serif; vertical-align: baseline; line-height: 12pt; color: rgb(0, 0, 0); background-color: rgb(244, 244, 244);&#34;&gt;
  &lt;span data-mce-style=&#34;margin: 0px; padding: 0px; border: 0px; font-weight: inherit; font-style: inherit; font-size: 16px; vertical-align: baseline;&#34; style=&#34;margin: 0px; padding: 0px; border: 0px; font-weight: inherit; font-style: inherit; font-size: 16px; vertical-align: baseline;&#34;&gt;用gdb在远程linux机器上调试程序实在太不方便了。于是想到用eclipse的GUI调试。下面介绍&lt;span data-mce-style=&#34;margin: 0px; padding: 0px; border: 0px; font-weight: inherit; font-style: inherit; font-size: 16px; vertical-align: baseline;&#34; style=&#34;margin: 0px; padding: 0px; border: 0px; font-weight: inherit; font-style: inherit; vertical-align: baseline;&#34;&gt;如何从windows&lt;span data-mce-style=&#34;margin: 0px; padding: 0px; border: 0px; font-weight: inherit; font-style: inherit; font-size: 16px; vertical-align: baseline;&#34; style=&#34;margin: 0px; padding: 0px; border: 0px; font-weight: inherit; font-style: inherit; vertical-align: baseline;&#34;&gt;远程调试&lt;/span&gt;&lt;span data-mce-style=&#34;margin: 0px; padding: 0px; border: 0px; font-weight: inherit; font-style: inherit; font-size: 16px; vertical-align: baseline;&#34; style=&#34;margin: 0px; padding: 0px; border: 0px; font-weight: inherit; font-style: inherit; vertical-align: baseline;&#34;&gt;linux&lt;/span&gt;&lt;span data-mce-style=&#34;margin: 0px; padding: 0px; border: 0px; font-weight: inherit; font-style: inherit; font-size: 16px; vertical-align: baseline;&#34; style=&#34;margin: 0px; padding: 0px; border: 0px; font-weight: inherit; font-style: inherit; vertical-align: baseline;&#34;&gt;程序。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;</description>
    </item>
    <item>
      <title>我的BUG大全。</title>
      <link>https://ykyi.net/?p=947/</link>
      <pubDate>Sat, 23 Mar 2013 03:32:22 +0000</pubDate>
      <guid>https://ykyi.net/?p=947/</guid>
      <description>&lt;p&gt;在这里记下我的程序BUG&lt;/p&gt;
&lt;h1 id=&#34;buff溢出后把栈破坏了这个线程也没崩溃一直死循环在一小段不可知的代码里&#34;&gt;buff溢出后，把栈破坏了，这个线程也没崩溃，一直死循环在一小段不可知的代码里。&lt;/h1&gt;
&lt;p&gt;#调用getaddrinfo很多次以后，getaddrinfo报错：No address associated with NAME。非常地奇怪呀&lt;del&gt;后来把同样的程序部署到比较旧的linux上，报错: Too many open files。才明白，原来fd被用光了。回头再检查相关代码，果然如此~补上close(fd)后，getaddrinfo的问题也解决了。启发是：1. 有些报错信息其实离真正的错误原因很远。2. 一个系统调用一开始正常，跑了很多次后失败，应该怀疑是不是有资源泄露。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;#把uint_t类型赋值给std::string时，会崩溃在std::string里面。&lt;/p&gt;
&lt;p&gt;#当一个预期统一的规则出现特例的时候容易出现BUG. 关联订单，关联片区，入货地址都指受YYYY-MM-DD HH:MM:SS的时间戳，但同机分析接受的时间戳却是YYYYMMDD某一天的时间戳。有一个组合需求是同时导出上述4个小需求时，由于传入的时间戳参数不一致导致了BUG.&lt;/p&gt;
&lt;h1 id=&#34;vectorpush_back可能会重新分配vector的内存导致指向之前元素的引用和指针失效一个stdfunction持有一个stdref指向vector中的一个元素当这个funcction被调用的时候vector中的这个元素已经失效了&#34;&gt;vector::push_back可能会重新分配vector的内存，导致指向之前元素的引用和指针失效.一个std::function持有一个std::ref指向vector中的一个元素，当这个funcction被调用的时候，vector中的这个元素已经失效了。&lt;/h1&gt;
&lt;p&gt;&lt;span style=&#34;font-size: 13.3333330154419px; line-height: 13.8666658401489px;&#34;&gt;# 用boost::optional记录一个信息。这个信息没及时在clear函数里做清理。于是，观察到的情况时，这个信息总是被打印。但一开始，我们却怀疑是另外的函数不稳定而重新生成了该信息。&lt;/span&gt;&lt;/p&gt;
&lt;h1 id=&#34;在写一个匹配函数时待匹配操作数是一个字符串我没有考虑字符串是空串的情况&#34;&gt;在写一个匹配函数时，待匹配操作数是一个字符串，我没有考虑字符串是空串的情况。&lt;/h1&gt;
&lt;h1 id=&#34;在比较旧的gcc-412上把shared_ptr赋给weak_ptr时崩溃溃在atomic_exchange_and_add一开始怀疑是旧版gcc对boost的智能指针支持的不够好后来发现是因为weak_ptr此时已经失效了原因是用handler的参数持用shared_ptr的引用做生命期管理时传错了参数使得这个对象已经被销毁了&#34;&gt;在比较旧的gcc 4.1.2上把shared_ptr赋给 weak_ptr时，崩溃。溃在atomic_exchange_and_add。一开始怀疑是旧版gcc对boost的智能指针支持的不够好，后来发现是因为weak_ptr此时已经失效了。原因是用handler的参数持用shared_ptr的引用做生命期管理时，传错了参数，使得这个对象已经被销毁了。&lt;/h1&gt;
&lt;h1 id=&#34;现象一个依赖某布尔变量的逻辑大多数时候正常少部分时间异常期望这个布尔变量是false有时候陌名其妙变成了true&#34;&gt;现象：一个依赖某布尔变量的逻辑大多数时候正常，少部分时间异常。期望这个布尔变量是false，有时候陌名其妙变成了true。&lt;/h1&gt;
&lt;p&gt;原因是此布尔变量未被初始化，大多数时候它的值是false，但有时却不是。&lt;/p&gt;
&lt;p&gt;#. 现象rmap_item泄露.&lt;/p&gt;
&lt;p&gt;Fix it: 单链表插入新结点时指针操作出错。应该是new-&amp;gt;rmap_list = _item，被我写成 new-&amp;gt;rmap_list = (_item)-&amp;gt;rmap_list.&lt;/p&gt;
&lt;p&gt;#. 我意图注释掉某行代码，却鬼使神差注释错了一行代码。&lt;/p&gt;
&lt;p&gt;#. 变量名 pkt 和ptr 很像，在用memcpy函数时用错了变量导致bug. 一块内存被莫名其妙的修改了，很有可能是因为像刚才这样写这块函数的参数填错了。&lt;/p&gt;
&lt;p&gt;#. _sessions.erase(ite++);删除了_sessions维护的一个对象.对象的析构被调用，会有一连串对象的析构因此而被调用。这些对象中的指针很可能就失效了。但是，在代码的其它地方还能拿到这个指针。野指针啊！！！今天这个例子中是session维护的ip_pkt对象都被析构了，ip_pkt中的指针也都失效了。于是，一使用野指针，崩溃了。&lt;/p&gt;
&lt;p&gt;#. 删除数据时，总是要注意其它代码中指向这些被删除数据的引用或指针。&lt;/p&gt;
&lt;p&gt;#. 解引用container.end()返回的迭代器会崩溃。&lt;/p&gt;
&lt;p&gt;#. 这是个腾讯视频广告投放组的bug. 一个线程负责开，关FD。另一个线程读写FD。两个线程的竞争条件造成了BUG.&lt;/p&gt;
&lt;p&gt;#. 写代码时偷懒复制代码，然后忘记做相应更改，视觉上很难在第一时间察觉，却在后期花费了几倍时间调试程序。&lt;/p&gt;
&lt;p&gt;#. 写判断语句时，判断表达示如 container.empty()之前是否要取反，经常搞错。&lt;/p&gt;
&lt;p&gt;#. htonl 写成 htons&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;font-size: 13px;&#34;&gt;#. std::distance 计算两个迭代器之间距离时死循环，是因为迭代器没有初始化。而我之前想，作初始化工作的函数已经调用了，实际上并没有被调用。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;font-size: 13px;&#34;&gt;#. 没注意函数的返回值. 有时函数返回0时表示成功，即true的含义。所以看到一些和预期刚好相反的现象时，应该考虑是不是出现了这样的错误。&lt;/span&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
