<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>主页</title>
    <description>勤力一定揾到食</description>
    <link>https://jasenchao.github.io/</link>
    <atom:link href="https://jasenchao.github.io/feed.xml" rel="self" type="application/rss+xml" />
    
      <item>
        <title>ROS中创建python包供脚本文件调用</title>
        <description>
          
          问题描述 原因排查 解决方法 问题描述 在某个ros package中，我在scripts目录下创建了3个py文件，其中一个是执行创建ros node的a.py，其他两个是封装了类的b.py和c.py，我在a.py中写了： import b import c 然后将3个文件都放进了CMakeLists中： catkin_install_python(PROGRAMS scripts/a.py scripts/b.py scripts/c.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} ) 然后在rosrun运行a.py时遇到了import失败的问题。 原因排查 在工作空间的devel/lib目录下，我找到了安装后的python脚本，发现ROS是通过exec调用源文件执行脚本的，所以b.py和c.py也是通过exec调用，因而a.py找不到import之后的内容，所以这样的作法肯定是不对的。 解决方法 在CMakeLists中只需要安装要执行的脚本文件，其他文件封装为python包安装，需要取消catkin_python_setup()的注释： catkin_python_setup() catkin_install_python(PROGRAMS scripts/a.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} ) 在ros package的src目录下新建一个文件夹，命名为要封装的python包名，例如my_package，然后将b.py和c.py都移动到my_package目录下。 在ros package目录下新建setup.py文件： from distutils.core import setup from catkin_pkg.python_setup import generate_distutils_setup setup_args = generate_distutils_setup( packages=['my_package'], package_dir={'my_package': 'src/my_package'}, ) setup(**setup_args)...
        </description>
        <pubDate>Fri, 03 May 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-05-03-ROS%E4%B8%AD%E5%88%9B%E5%BB%BApython%E5%8C%85%E4%BE%9B%E8%84%9A%E6%9C%AC%E6%96%87%E4%BB%B6%E8%B0%83%E7%94%A8/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-05-03-ROS%E4%B8%AD%E5%88%9B%E5%BB%BApython%E5%8C%85%E4%BE%9B%E8%84%9A%E6%9C%AC%E6%96%87%E4%BB%B6%E8%B0%83%E7%94%A8/</guid>
      </item>
    
      <item>
        <title>MIT 6.5830 simpleDB Lab4</title>
        <description>
          
          Exercise 1 Exercise 2 Exercise 3 Exercise 4 Exercise 5 Exercise 1 需要完成的是为事务加锁，涉及到修改BufferPool.java中的getPage()、unsafeReleasePage()和holdsLock()方法。实验手册建议定义一个LockManager类来维护事务和锁的状态。 实验手册为了实现事务的ACID，要求实现共享锁和排他锁，而实验代码已经提供了Permissions类，刚好对应只读操作和读写操作。 getPage代码： public Page getPage(TransactionId tid, PageId pid, Permissions perm) throws TransactionAbortedException, DbException { // TODO: some code goes here try { if (!lockManager.acquireLock(tid, pid, perm, 0)) { throw new TransactionAbortedException(); } } catch (InterruptedException e) {...
        </description>
        <pubDate>Wed, 17 Apr 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-04-17-MIT-6.830-simpleDB-Lab4/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-04-17-MIT-6.830-simpleDB-Lab4/</guid>
      </item>
    
      <item>
        <title>MIT 6.5830 simpleDB Lab3</title>
        <description>
          
          Exercise 1 Exercise 2 Exercise 3 Exercise 4 Extra Credit Exercise 1 需要完成的是： src/java/simpledb/optimizer/IntHistogram.java 实验手册介绍了基于桶的方法来计算直方图，以便进行选择估计。直方图是一种统计报告，表示数据分布的频率。这里要完成的就是记录表的信息，实现基于桶的方法。 IntHistogram.java代码： package simpledb.optimizer; import simpledb.execution.Predicate; /** * A class to represent a fixed-width histogram over a single integer-based field. */ public class IntHistogram { private int[] buckets; private int min; private int max; private double...
        </description>
        <pubDate>Wed, 17 Apr 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-04-17-MIT-6.830-simpleDB-Lab3/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-04-17-MIT-6.830-simpleDB-Lab3/</guid>
      </item>
    
      <item>
        <title>MIT 6.5830 simpleDB Lab2</title>
        <description>
          
          Exercise 1 Exercise 2 Exercise 3 Exercise 4 Exercise 5 A simple test Parser Exercise 1 需要完成的是： src/java/simpledb/execution/Predicate.java src/java/simpledb/execution/JoinPredicate.java src/java/simpledb/execution/Filter.java src/java/simpledb/execution/Join.java 这里主要实现两个功能： Filter：通过Predicate过滤一部分满足条件的Tuple Join：通过JoinPredicate将满足条件的两个子集的元组连接起来 Predicate.java代码： package simpledb.execution; import simpledb.storage.Field; import simpledb.storage.Tuple; import java.io.Serializable; /** * Predicate compares tuples to a specified Field value. */ public class Predicate implements Serializable {...
        </description>
        <pubDate>Wed, 17 Apr 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-04-17-MIT-6.830-simpleDB-Lab2/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-04-17-MIT-6.830-simpleDB-Lab2/</guid>
      </item>
    
      <item>
        <title>MIT 6.5830 simpleDB Lab1</title>
        <description>
          
          Exercise 1 Exercise 2 Exercise 3 Exercise 4 Exercise 5 Exercise 6 A simple test Exercise 1 需要完成的代码有： src/java/simpledb/storage/TupleDesc.java src/java/simpledb/storage/Tuple.java Tuple是simpleDB的元组，由多个Field（字段）组成，TupleDesc负责描述Tuple中各个Field对应的schema。 Tuple.java代码： package simpledb.storage; import java.io.Serializable; import java.util.Arrays; import java.util.Iterator; import java.util.concurrent.CopyOnWriteArrayList; /** * Tuple maintains information about the contents of a tuple. Tuples have a * specified schema specified...
        </description>
        <pubDate>Wed, 17 Apr 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-04-17-MIT-6.830-simpleDB-Lab1/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-04-17-MIT-6.830-simpleDB-Lab1/</guid>
      </item>
    
      <item>
        <title>涉及标准输入输出的问题解决方案模板（ACM模式模板）</title>
        <description>
          
          空格分隔时读取输入 逗号分隔时读取输入 昨天华为的笔试第一题，每一行的输入包含多种数据类型，都是用逗号隔开的，因为平时习惯了用空格分隔，吃了个措手不及的亏。 空格分隔时读取输入 如果输入包含字符串、整数、小数等，用空格隔开，需要相应地修改读取输入的方式。 C++示例： #include &amp;lt;iostream&amp;gt; #include &amp;lt;string&amp;gt; using namespace std; int main() { // 读取输入值 string str; int a; double b; cin &amp;gt;&amp;gt; str &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b; // 处理数据 double sum = a + b; // 输出结果 cout &amp;lt;&amp;lt; &quot;String: &quot; &amp;lt;&amp;lt; str &amp;lt;&amp;lt; endl; cout...
        </description>
        <pubDate>Thu, 11 Apr 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-04-11-%E6%B6%89%E5%8F%8A%E6%A0%87%E5%87%86%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E7%9A%84%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E6%A8%A1%E6%9D%BF/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-04-11-%E6%B6%89%E5%8F%8A%E6%A0%87%E5%87%86%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E7%9A%84%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E6%A8%A1%E6%9D%BF/</guid>
      </item>
    
      <item>
        <title>打包RPM时谨防rpath</title>
        <description>
          
          rpath问题 检查rpath问题 内部库 非内部库 替代 rpath 的方法 删除rpath rpath问题 rpath指的是有时代码会在链接二进制文件时对特定的库路径进行硬编码（使用 -rpath 或 -R 标志）。 通常，动态链接器和加载器（ld.so）可以解决可执行文件对共享库的依赖关系并加载所需的内容。但是当使用 -rpath 或 -R 时，位置信息将会硬编码到二进制文件中并在执行开始时由 ld.so 检查。 由于 Linux 动态链接器通常比硬编码路径更智能，Fedora 通常不允许使用 rpath。 检查rpath问题 在rpmdevtools中包含一个名为 check-rpaths 的工具。在配置文件中添加宏%__arch_install_post~/.rpmmacros来检查rpath问题： %__arch_install_post \ /usr/lib/rpm/check-rpaths \ /usr/lib/rpm/check-buildroot 当 check-rpaths 运行时，可能会出现以下输出： ERROR 0001: file '/usr/bin/xapian-tcpsrv' contains a standard rpath '/usr/lib64' in [/usr/lib64] 这表示二进制文件中包含了...
        </description>
        <pubDate>Tue, 02 Apr 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-04-02-%E6%89%93%E5%8C%85RPM%E6%97%B6%E8%B0%A8%E9%98%B2rpath/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-04-02-%E6%89%93%E5%8C%85RPM%E6%97%B6%E8%B0%A8%E9%98%B2rpath/</guid>
      </item>
    
      <item>
        <title>vector resize和reserve的区别</title>
        <description>
          
          resize() 函数 reserve() 函数 在 C++ 的标准库中，resize() 和 reserve() 是用于操作 std::vector 容器的两个不同函数，它们的作用和效果有所区别。 resize() 函数 resize() 函数用于改变 std::vector 容器的大小，即调整容器中元素的数量。 如果当前 vector 的大小小于指定的大小，resize() 会在容器末尾添加默认构造的元素，使得 vector 的大小达到指定大小。 如果当前 vector 的大小大于指定的大小，resize() 会删除多余的元素，使得 vector 的大小等于指定大小。 std::vector&amp;lt;int&amp;gt; vec; vec.resize(5); // 将 vec 的大小调整为 5，新增的元素值为默认值（int 类型默认为0） reserve() 函数 reserve() 函数用于为 std::vector 容器预留存储空间，但并不改变容器中元素的数量。 当使用 reserve() 后，vector 的容量会增加，但 vector...
        </description>
        <pubDate>Fri, 22 Mar 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-03-22-vector-resize%E5%92%8Creserve%E7%9A%84%E5%8C%BA%E5%88%AB/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-03-22-vector-resize%E5%92%8Creserve%E7%9A%84%E5%8C%BA%E5%88%AB/</guid>
      </item>
    
      <item>
        <title>使用cgroups进行资源限制和管理</title>
        <description>
          
          挂载 cgroup 文件系统 创建 cgroup 设置资源限制 添加资源受限的进程到 cgroup cgroups 是内核提供的一种机制，可以用来限制一组进程的资源使用。通过创建 cgroups 并设置相应的限制参数，可以确保多个程序共同运行时每个程序占用的资源受到限制。 挂载 cgroup 文件系统 查看 cgroup 是否已经挂载： mount | grep cgroup 如果没有挂载，则编辑/etc/fstab文件添加以下内容来挂载： cgroup /sys/fs/cgroup cgroup defaults 0 0 重新加载/etc/fstab文件： mount -a 创建 cgroup 以创建名为 mygroup 的 cgroup 为例，可以执行以下命令： mkdir /sys/fs/cgroup/mygroup 设置资源限制 在创建的 cgroup 目录中，通过修改 cgroup 下的文件来实现对各种资源的限制，比如 CPU 使用量、内存占用、IO 带宽等。比如：...
        </description>
        <pubDate>Wed, 20 Mar 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-03-20-%E4%BD%BF%E7%94%A8cgroups%E8%BF%9B%E8%A1%8C%E8%B5%84%E6%BA%90%E9%99%90%E5%88%B6%E5%92%8C%E7%AE%A1%E7%90%86/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-03-20-%E4%BD%BF%E7%94%A8cgroups%E8%BF%9B%E8%A1%8C%E8%B5%84%E6%BA%90%E9%99%90%E5%88%B6%E5%92%8C%E7%AE%A1%E7%90%86/</guid>
      </item>
    
      <item>
        <title>Linux下的I/O多路复用</title>
        <description>
          
          select poll epoll 在 I/O 多路复用中，epoll、poll 和 select 是常用的三种机制，它们都可以用于实现事件驱动的网络编程。 select select 是 Unix 系统最早引入的 I/O 多路复用函数，它允许一个进程监视多个文件描述符，当其中任何一个文件描述符准备好进行 I/O 操作时，select 函数就会返回。 优点：跨平台支持好，几乎所有的操作系统都支持 select。 缺点：效率较低，因为在调用 select 函数后，内核需要遍历所有的文件描述符来检查状态变化，同时 select 函数有最大文件描述符数量的限制。 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;sys/time.h&amp;gt; #include &amp;lt;sys/types.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;sys/socket.h&amp;gt; int main() { int server_socket, client_socket, max_sd, activity; struct sockaddr_in...
        </description>
        <pubDate>Tue, 19 Mar 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-03-19-Linux%E4%B8%8B%E7%9A%84IO%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-03-19-Linux%E4%B8%8B%E7%9A%84IO%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8/</guid>
      </item>
    
      <item>
        <title>Linux下生成核心转储core</title>
        <description>
          
          
  核心转储大小限制
  核心转储文件的位置和命名规则
  永久生效
  立即生效


为了方便进行分析调试，希望当程序发生崩溃或者收到 SIGSEGV、SIGABRT 等信号时，系统会生成相应的核心转储文件。

核心转储大小限制

首先，要检查核心转储的大小限制。可以使用 ulimit 命令来查看当前用户的核心转储大小限制：

ulimit -c


如果输出为 0，则表示不生成核心转储文件。可以使用以下命令来设置核心转储大小限制为无限制：

ulimit -c unlimited


核心转储文件的位置和命名规则

核心转储文件默认会生成在当前进程的工作目录下，文件名通常为 core。如果需要更改核心转储文件的生成位置和命名规则，可以通过修改 /proc/sys/kernel/core_pattern 文件来实现。

echo &quot;/tmp/core-%e-%s-%u-%g-%p-%t&quot; &amp;gt; /proc/sys/kernel/core_pattern


上述命令将核心转储文件命名规则修改为 /tmp/core-可执行文件名-信号编号-用户ID-组ID-进程ID-时间戳。

永久生效

如果想要在系统重启后仍然保持核心转储设置，可以修改 /etc/sysctl.conf 文件，在文件末尾添加以下内容：

kernel.core_pattern = /tmp/core-%e-%s-%u-%g-%p-%t


立即生效

使用 sysctl 命令使设置立即生效：

sysctl -p


        </description>
        <pubDate>Tue, 19 Mar 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-03-19-Linux%E4%B8%8B%E7%94%9F%E6%88%90%E6%A0%B8%E5%BF%83%E8%BD%AC%E5%82%A8core/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-03-19-Linux%E4%B8%8B%E7%94%9F%E6%88%90%E6%A0%B8%E5%BF%83%E8%BD%AC%E5%82%A8core/</guid>
      </item>
    
      <item>
        <title>#pragma指令</title>
        <description>
          
          控制编译警告 控制优化策略 控制对齐方式 控制库文件 #pragma 是一个在 C 和 C++ 中使用的编译器指令，用于向编译器发出特定的命令或控制编译的行为。 控制编译警告 通过 #pragma warning 指令，可以在特定位置或范围内控制编译器的警告行为，如禁止某个警告、将警告作为错误处理等。例如禁止特定的编译警告： #pragma warning(disable: 4996) // 禁止特定警告（比如4996号警告） 控制优化策略 通过 #pragma optimize 等指令，可以控制编译器的优化级别，例如关闭或开启特定的优化。例如关闭编译器的优化： #pragma optimize(&quot;g&quot;, off) // 关闭优化 控制对齐方式 通过 #pragma pack 指令，可以设置结构体成员的对齐方式。例如与外部系统交互或者需要精确控制内存布局时控制结构体成员的对齐方式： #pragma pack(push, 1) // 设置按字节对齐 struct MyStruct { char a; int b; }; #pragma pack(pop)...
        </description>
        <pubDate>Mon, 18 Mar 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-03-18-pragma%E6%8C%87%E4%BB%A4/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-03-18-pragma%E6%8C%87%E4%BB%A4/</guid>
      </item>
    
      <item>
        <title>内存泄漏调试工具</title>
        <description>
          
          ASan (AddressSanitizer)： Valgrind： Coverity： Gperftools： 对比 asan、valgrind、coverity和gpertools都是用于帮助开发人员发现和调试代码中的各种问题的工具，但它们在特定方面有着不同的重点和功能。 ASan (AddressSanitizer)： ASan 常用于 C/C++ 代码的静态和动态内存访问错误检测，通过在编译时注入额外的代码来对内存进行访问监控，包括缓冲区溢出、使用已释放内存、内存泄漏等问题。 #include &amp;lt;stdio.h&amp;gt; int main() { int buffer[5]; for (int i = 0; i &amp;lt;= 5; i++) { // 访问数组越界 buffer[i] = i; } return 0; } 编译以上程序时使用 ASan 进行内存错误检测： $ gcc -fsanitize=address -o program program.c 程序运行时将会报告内存访问错误： $...
        </description>
        <pubDate>Sun, 17 Mar 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-03-17-%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%E8%B0%83%E8%AF%95%E5%B7%A5%E5%85%B7/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-03-17-%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%E8%B0%83%E8%AF%95%E5%B7%A5%E5%85%B7/</guid>
      </item>
    
      <item>
        <title>如何判断操作系统大小端</title>
        <description>
          
          
用一个函数判断当前系统是大端序（big-endian）还是小端序（little-endian）：

#include &amp;lt;stdio.h&amp;gt;

int check_endian() {
    unsigned int num = 1;
    char *ptr = (char *)&amp;amp;num;
    return (int)*ptr;
}

int main() {
    if (check_endian() == 1) {
        printf(&quot;小端序\n&quot;);
    } else {
        printf(&quot;大端序\n&quot;);
    }
    return 0;
}


通过创建一个整数变量 num 并获取其地址，然后将地址转换为字符指针 ptr。通过检查该指针所指向的内存位置上的值，就可以确定系统的字节序。

        </description>
        <pubDate>Thu, 14 Mar 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-03-14-%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%A4%A7%E5%B0%8F%E7%AB%AF/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-03-14-%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%A4%A7%E5%B0%8F%E7%AB%AF/</guid>
      </item>
    
      <item>
        <title>使用msmtp发送邮件</title>
        <description>
          
          安装 msmtp 和 mail 配置 msmtp 设置权限 测试邮件发送 最近需要在服务器上运行一些时间很长的命令，想让服务器自动通知我什么时候命令完成，通过命令结束后发送邮件给我来提醒。 安装 msmtp 和 mail # RedHat 系 sudo dnf install msmtp mailx # Debian 系 sudo apt install msmtp mailutils 配置 msmtp 创建或编辑.msmtprc，内容示例如： # Set default values for all following accounts. defaults auth on tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt logfile ~/.msmtp.log #...
        </description>
        <pubDate>Thu, 08 Feb 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-02-08-%E4%BD%BF%E7%94%A8msmtp%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-02-08-%E4%BD%BF%E7%94%A8msmtp%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6/</guid>
      </item>
    
      <item>
        <title>通过注册表交换Ctrl键和CapsLock键</title>
        <description>
          
          频繁地使用左下角的Ctrl键对我的小拇指产生了非常大的负担，想把它和不常用但很容易按的CapsLock键交换。 先打开注册表，导航到HKEY_LOCAL_MACHINE -&amp;gt; System -&amp;gt; CurrentControlSet -&amp;gt; Control -&amp;gt; KeyBoard Layout。 右键新建 -&amp;gt; 二进制值，命名为Scancode Map。 右键新建的Scancode Map，选择修改，如果交换左Ctrl键，输入 00 00 00 00 00 00 00 00 03 00 00 00 1D 00 3A 00 3A 00 1D 00 00 00 00 00 如果交换右Ctrl键，输入 00 00 00 00 00 00 00 00...
        </description>
        <pubDate>Thu, 25 Jan 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-01-25-%E9%80%9A%E8%BF%87%E6%B3%A8%E5%86%8C%E8%A1%A8%E4%BA%A4%E6%8D%A2Ctrl%E9%94%AE%E5%92%8CCapsLock%E9%94%AE/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-01-25-%E9%80%9A%E8%BF%87%E6%B3%A8%E5%86%8C%E8%A1%A8%E4%BA%A4%E6%8D%A2Ctrl%E9%94%AE%E5%92%8CCapsLock%E9%94%AE/</guid>
      </item>
    
      <item>
        <title>一些调试可执行程序的手段</title>
        <description>
          
          readelf objdump gcc strace readelf readelf可以用来查看一个可执行文件的信息，例如： readelf -a a.out | less objdump objdump是一个用于查看目标文件（如可执行文件、共享库、静态库等）信息的工具，它可以显示目标文件的各种信息，包括符号表、段信息、反汇编代码等。以下是一些常用的 objdump 选项： -d, –disassemble：显示反汇编代码。 -t, –syms：显示符号表。 -h, –section-headers：显示目标文件的段（section）头信息。 -x, –all-headers：显示全部头信息（包括段头和符号表等）。 -s, –full-contents：显示目标文件的完整内容，包括所有段的十六进制内容。 -f, –file-headers：显示文件头信息。 -R, –dynamic-reloc：显示动态重定位表。 gcc 在gcc编译时也可以加入一些选项使得可以查看的内容更多： –verbose：查看所有的编译选项。 -Wl,–verbose：查看所有的链接选项。 -static：静态链接，会链接libc。 strace strace 是一个用于跟踪程序系统调用的工具，常用的选项包括： -e trace=set：指定需要跟踪的系统调用，set 可以是以下之一或多个： file：文件操作 network：网络操作 process：进程控制 signal：信号处理 syscall：所有系统调用 -p PID：跟踪指定PID的进程。 -o filename：将输出写入到指定的文件中。 -f：跟踪由被跟踪进程创建的子进程。...
        </description>
        <pubDate>Mon, 22 Jan 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-01-22-%E4%B8%80%E4%BA%9B%E8%B0%83%E8%AF%95%E5%8F%AF%E6%89%A7%E8%A1%8C%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%89%8B%E6%AE%B5/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-01-22-%E4%B8%80%E4%BA%9B%E8%B0%83%E8%AF%95%E5%8F%AF%E6%89%A7%E8%A1%8C%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%89%8B%E6%AE%B5/</guid>
      </item>
    
      <item>
        <title>bits/libc-header-start.h: No such file or directory</title>
        <description>
          
          
  问题出现
  解决方法


问题出现

在编译一个工程的时候，出现了报错

In file included from /usr/lib/gcc/x86_64-linux-gnu/9/include/stdint.h:9,
                 from main.c:1:                                                                                                      
/usr/include/stdint.h:26:10: fatal error: bits/libc-header-start.h: No such file or directory                           
   26 | #include &amp;lt;bits/libc-header-start.h&amp;gt;                                                                                          
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~


解决方法

发现这个工程是要分别编译32位和64位的，因此才会出现这个问题，安装gcc-multilib来解决。

        </description>
        <pubDate>Mon, 22 Jan 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-01-22-libc-header-start.h'-No-such-file-or-directory/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-01-22-libc-header-start.h'-No-such-file-or-directory/</guid>
      </item>
    
      <item>
        <title>SSH 到 Git 时 Connection timed out</title>
        <description>
          
          
  问题出现
  解决方案


问题出现

git仓库是使用ssh链接clone下来的，在push和pull到github时突然失效了，显示Connection timed out，ssh -T git@github.com一样不行

解决方案

编辑文件~/.ssh/config，添加以下内容

Host github.com
HostName ssh.github.com
User git
Port 443
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa


再操作就可以了。

        </description>
        <pubDate>Thu, 18 Jan 2024 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2024-01-18-SSH%E5%88%B0Git%E6%97%B6Connection-timed-out/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2024-01-18-SSH%E5%88%B0Git%E6%97%B6Connection-timed-out/</guid>
      </item>
    
      <item>
        <title>Python 中 print 函数的用法</title>
        <description>
          
          在 Python 中，可以使用print函数来打印一个变量或者一个字符串： print(&quot;My name is Alice&quot;) print(i) 如果需要字符串格式化来打印一句话中包含变量的内容，有几种常用的方法： 使用格式化字符串（f-string）：在字符串前面加上字母”f”，然后在字符串中使用大括号{}包裹变量名。示例代码如下： name = &quot;Alice&quot; age = 25 print(f&quot;My name is {name} and I am {age} years old.&quot;) 使用字符串的format()方法：在字符串中使用一对花括号{}作为占位符，并调用format()方法传入变量值。示例代码如下： name = &quot;Alice&quot; age = 25 print(&quot;My name is {} and I am {} years old.&quot;.format(name, age)) 使用百分号（%）进行格式化：在字符串中使用百分号作为占位符，并使用%运算符将变量与占位符关联起来。示例代码如下： name = &quot;Alice&quot; age =...
        </description>
        <pubDate>Tue, 28 Nov 2023 00:00:00 +0000</pubDate>
        <link>https://jasenchao.github.io/2023-11-28-Python%E4%B8%ADprint%E7%9A%84%E7%94%A8%E6%B3%95/</link>
        <guid isPermaLink="true">https://jasenchao.github.io/2023-11-28-Python%E4%B8%ADprint%E7%9A%84%E7%94%A8%E6%B3%95/</guid>
      </item>
    
  </channel>
</rss>
