프로그램을 디버깅할 때는 항상 다양한 문제가 발생합니다. Node.js의 비동기식 워크플로는 이 힘든 프로세스에 복잡성을 더합니다. V8 엔진이 비동기 스택 추적에 대한 액세스를 용이하게 하기 위해 일부 업데이트를 수행했지만 대부분의 경우 프로그램의 메인 스레드에서만 오류가 발생하므로 디버깅이 다소 어려워집니다. 마찬가지로 Node.js 프로그램이 충돌할 때 코어 덤프를 분석하기 위해 정교한 CLI 도구에 의존해야 하는 경우가 많습니다. 이 글에서는 Node.js 프로그램을 디버그하는 몇 가지 쉬운 방법을 소개하겠습니다. [동영상 튜토리얼 추천 :
node js tutorialconsole.log
문을 배치하는 경향이 있지만 이는 프로덕션에서 실제로 확장 가능한 전략은 아닙니다. 중요한 정보를 식별하려면 필터링 및 정리를 수행하거나 일관된 로깅 전략을 구현해야 할 수도 있습니다. 적절한 로그 지향 디버깅 전략을 구현하려면 Pinoconsole.log
语句,但这并不是生产中真正可扩展的策略。你可能需要进行一些过滤和清理,或者实施一致的日志记录策略,以便从中识别出重要的信息。
要实施适当的面向日志的调试策略,可以用 Pino或 Winston 之类的日志记录工具。这些将允许你设置日志级别(INFO
、 WARN
、ERROR
),它们允许你在本地打印详细的日志消息,同时在生产环境下仅打印严重的日志消息。你还可以将这些日志流式传输到聚合器或其他地方,例如 LogStash,Papertrail 甚至 Slack。
日志记录只能使我们了解程序为何无法按预期运行。对于复杂的调试,我们将希望使用断点来检查代码在执行时的行为。
为此,可以使用 Node Inspect。 Node Inspect 是 Node.js 附带的调试工具。它实际上只是程序的 Chrome DevTools 的实现,可让你添加断点、控制分步执行、查看变量、并遵循调用堆栈。
有两种方法启动 Node Inspect,但最简单的方法可能就是使用 --inspect-brk
标志来调用 Node.js 应用程序:
$ node --inspect-brk $your_script_name
启动程序后,前往 Chrome 浏览器中的 chrome://inspect
또는 Winston 및 기타 로깅 도구. 이를 통해 로그 수준(INFO
, WARN
, ERROR
)을 설정할 수 있으며, 작업 중에 자세한 로그 메시지를 로컬로 인쇄할 수 있습니다. 프로덕션 환경에서는 중요한 로그 메시지만 인쇄합니다. 또한 이러한 로그를 수집자 또는 LogStash, Papertrail 또는 Slack과 같은 다른 곳으로 스트리밍할 수도 있습니다.
Node Inspect를 시작하는 방법에는 두 가지가 있지만 아마도 가장 쉬운 방법은 --inspect-brk
플래그를 사용하여 Node.js 애플리케이션을 호출하는 것입니다: rrreee
chrome://inspect
URL로 이동하여 Chrome DevTools에 들어갑니다. Chrome DevTools를 사용하면 브라우저에서 JavaScript를 디버깅하는 데 필요한 모든 것이 제공됩니다. 가장 유용한 기능은 힙 스냅샷을 찍고 메모리 사용량을 구성하여 메모리 할당 방법과 메모리 누수 가능성을 이해할 수 있습니다.
지원되는 IDE 사용많은 최신 IDE에는 어떤 방식으로든 프로그램을 시작할 수 있을 뿐만 아니라 노드 프로그램 디버깅도 지원됩니다. Chrome DevTools에 있는 많은 기능 외에도
로그 포인트 생성🎜 기능, 여러 디버그 프로필 생성 기능과 같은 자체 기능도 함께 제공됩니다. 🎜Node.js Guide to Inspector Clients🎜를 확인하여 이러한 IDE에 대한 자세한 정보를 얻을 수 있습니다. 🎜🎜NDB 사용🎜🎜🎜🎜🎜또 다른 옵션은 격리된 로컬 디버거처럼 브라우저의 DevTools와 유사한 Node.js용 독립형 디버거인 🎜ndb🎜를 설치하는 것입니다. 또한 DevTools에서는 사용할 수 없는 몇 가지 추가 기능도 있습니다. 로컬 편집을 지원합니다. 즉, 코드를 수정하고 디버거 플랫폼에서 직접 지원하는 업데이트된 로직을 얻을 수 있습니다. 이는 빠른 반복에 적합합니다. 와🎜심각한 오류(예: 메모리 액세스 오류)로 인해 프로그램이 충돌한다고 가정해 보세요. 이러한 경우는 드물지만 발생합니다. 특히 애플리케이션이 네이티브 코드에 의존하는 경우 더욱 그렇습니다.
이러한 유형의 문제를 조사하려면 llnode를 사용할 수 있습니다. 프로그램이 충돌하면 llnode
는 JavaScript 스택 프레임과 개체를 C/C++ 측 개체에 매핑하여 검사할 수 있습니다. 이를 사용하려면 먼저 프로그램의 코어 덤프가 필요합니다. 이렇게 하려면 process.exit
대신 process.abort
를 사용하여 코드에서 프로세스를 닫아야 합니다. process.abort
를 사용하면 노드 프로세스가 종료될 때 코어 덤프 파일을 생성합니다. llnode
可以通过将 JavaScript 堆栈框架和对象映射到 C/C++ 端的对象来检查它们。为了使用它,你首先需要程序的核心转储。为此你需要使用 process.abort
而不是process.exit
来关闭代码中的进程。当你使用 process.abort
时,Node 进程在退出时会生成一个核心转储文件。
为了更好地理解 llnode
可以提供的功能,这个视频演示了其一些功能。
除了上述所有以外,还建议用第三方软件包做进一步调试。
第一个被简单地称为 debug。使用 debug,你可以基于函数名或整个模块为日志消息分配特定的命名空间。然后可以通过特定的环境变量选择将哪些消息打印到控制台。
例如,这是一个 Node.js 服务器,它正在记录来自整个程序和中间件栈的几条消息,例如 sequelize
,express:application
和 express:router
:
如果我们将 DEBUG 环境变量设置为 express:router
并启动相同的程序,则仅显示标记为 express:router
的消息:
通过以这种方式过滤消息,可以深入研究程序单个部分的行为方式,而无需大幅度更改代码的日志记录。
trace 和 clarify 两个模块最好在一起配合使用。
trace
通过提供有关被调用的异步方法的更多详细信息来扩展你的异步栈跟踪,这是 Node.js 默认不提供的路线图。 clarify
llnode
가 제공할 수 있는 내용을 더 잘 이해하려면 이 동영상에서 보여줍니다. 일부 기능 .
위의 모든 것 외에도 추가 디버깅을 위해 타사 패키지도 권장됩니다.
sequelize
, express:application
및 와 같은 전체 프로그램 및 미들웨어 스택에서 여러 메시지를 로깅하는 Node.js 서버입니다. 익스프레스:라우터
:🎜🎜🎜🎜DEBUG 환경 변수를 express:router
로 설정하고 동일한 프로그램을 시작하면 express:router
태그가 지정된 메시지만 표시됩니다. 🎜🎜🎜🎜통과된 필터링 메시지 이 방법을 사용하면 코드 로깅을 크게 변경하지 않고도 프로그램의 개별 부분이 어떻게 작동하는지 자세히 알아볼 수 있습니다. 🎜trace
호출되는 비동기 메서드에 대한 자세한 내용을 제공하여 비동기 스택 추적을 확장합니다. 이는 Node.js가 기본적으로 제공하지 않는 로드맵입니다. 명확화
는 Node.js 내부와 관련된 스택 추적에서 모든 정보를 제거하여 도움을 줍니다. 이를 통해 프로그램에 대한 함수 호출에만 집중할 수 있습니다. 🎜🎜이 모듈은 프로덕션 환경에서 실행하지 않는 것이 좋습니다! 로컬 개발 환경에서 디버깅할 때만 활성화해야 합니다. 🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 교육🎜을 방문하세요! ! 🎜🎜위 내용은 Node.js 프로그램을 디버깅하는 빠르고 쉬운 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!