Node.js Linux环境源码gdb编译调试学习指南

579 阅读1分钟

安装依赖

sudo apt-get install g++ curl libssl-dev apache2-utils git-core build-essential

从官网下载源码

git clone https://github.com/nodejs/node.git

编译调试

选择Debug构建类型,生成node_g命令

cd node
$ ./configure --debug && make -j4

这里不推荐make -j6占用内存太大,程序容易终止(signal 9)

编译完成后:

image.png

可能遇到的问题

image.png

signal 9 是一个 SIGKILL 信号,表示进程被强制终止。这通常是由于操作系统在内存不足时自动杀死了进程。

解决办法:扩大linux交换分区

$ mkdir -p /opt/swap/
$ cd /opt/swap/
## 创建10G大小交换分区
$ sudo dd if=/dev/zero of=swap bs=1024 count=10000000
$ sudo mkswap -f swap
$ sudo swapon swapfile

注意:这是一种临时swap分区,关机后创建的分区会消失,所以如果还需要分区,建议挂起

从入口进入调试

Node.js的入口文件为src/node_main.cc,我们从node_main.cc进入

$ gdb --args ./node_g src/node_main.cc

在使用gdb调试程序时,--args是一个命令行选项,用于指定程序运行时的命令行参数。它的语法如下:

gdb --args program arg1 arg2 ...

其中,program是要调试的程序的可执行文件路径,arg1arg2等是程序运行时的命令行参数。使用--args选项可以将程序运行时的命令行参数一并传递给gdb,方便在调试时使用。例如:

gdb --args ./myprogram arg1 arg2

下图,gdb已经运行成功 image.png

gdb操作

设置断点

进入调试我们可以先设置断点 b为设置断点命令缩写,完整为break

# 在main函数处设置断点
(gdb) b main

如图我们打好了一个断点

image.png

启动程序

r启动程序命令缩写,完整为run

(gdb) r

启动运行后在断点处停下

image.png

显示源码

l显示源码,完整为list

(gdb) l

image.png

可以看到mainreturn一个node::Start函数。在 C++ 中,双冒号 "::" 是作用域解析运算符,用于指定命名空间或类的作用域。所以这是一个node.cc文件中的Start函数,是Node.js的核心入口。