LD_PRELOAD에서 gdb를 사용하는 방법
특정 라이브러리를 LD_PRELOAD하는 프로그램을 실행하고 있습니다.이것처럼.
LD_PRELOAD=./my.so ./my_program
이 프로그램을 실행하는 방법gdb
?
다음을 수행합니다.
gdb your_program
(gdb) set environment LD_PRELOAD ./yourso.so
(gdb) start
인수와 환경을 사용하여 모든 것을 하나의 명령어로 실행하는 방법은 다음과 같습니다.
예:
gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l
예리한 관찰자는 을 알아차릴 것이다.env
Alexey Romanov의 답변과 같은 이그제큐티브 래퍼로서 기능합니다.
우리가 우연히 그런 사건에 부딪혔기 때문에 글을 올렸습니다.set environment
동작하지 않음:
set exec-wrapper wrapper show exec-wrapper unset exec-wrapper
'exec-wrapper'가 설정되면 지정된 래퍼가 디버깅을 위한 프로그램을 시작하는 데 사용됩니다. gdb는 폼 exec 래퍼 프로그램의 셸 명령으로 프로그램을 시작합니다.따옴표는 프로그램과 그 인수에 추가되지만 래퍼에는 추가되지 않으므로 셸에 적합한 경우 따옴표를 추가해야 합니다.래퍼는 프로그램이 실행될 때까지 실행되며 그 후 gdb가 제어됩니다.
최종적으로 execve를 호출하는 모든 프로그램을 인수와 함께 래퍼로 사용할 수 있습니다.env나 nohup 등 여러 표준 Unix 유틸리티가 이를 수행합니다.exec "$@"로 끝나는 Unix 쉘 스크립트도 작동합니다.
예를 들어 env를 사용하여 셸 환경에 변수를 설정하지 않고 디버깅된 프로그램에 환경 변수를 전달할 수 있습니다.
(gdb) set exec-wrapper env 'LD_PRELOAD=libtest.so' (gdb) run
제공할 수 있습니다.env
를 사용하여 명령줄에서 exec-module로 지정합니다.-iex
플래그:
gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program
VS 코드와 함께 gdbserver를 사용하고 있습니다.가장 간단한 방법은 셸로 포장된 프로그램을 실행하는 것입니다.
gdbserver :8888 sh -c 'LD_PRELOAD=/libtest.so your_prog'
기본적으로 동일한 방법으로 작업을 수행할 수 있습니다.gdb
프로그램 이름 앞:
LD_PRELOAD=./my.so gdb ./my.program
다음을 사용하여 환경 변수를 확인할 수 있습니다.
(gdb) show environment LD_PRELOAD
드문 경우지만 gdb 내에서 실제로 변경해야 합니다.예를 들어 디버깅을 할 때dlopen()
다음과 같이 합니다.
(gdb) set environment LD_PRELOAD ./my.so
오, 잠깐만요.gdb 7.6.2에서는 동작하지 않습니다.라이브러리가 로딩되지 않습니다. 즉, 적어도 현재 툴에서는 이 질문에 대한 답이 완전히 정확하지 않습니다.
언급URL : https://stackoverflow.com/questions/10448254/how-to-use-gdb-with-ld-preload
'programing' 카테고리의 다른 글
Android에서 모바일 장치의 위도와 경도를 얻는 방법 (0) | 2022.08.08 |
---|---|
vuex 작업 Vue.js에서 개체 어레이를 정렬할 수 없습니다. (0) | 2022.08.07 |
'for' 루프에서 1씩 증가할 때 != 대신 > (<)를 사용해야 하는 기술적 이유가 있습니까? (0) | 2022.08.07 |
register Natives() 메서드는 무엇을 합니까? (0) | 2022.08.07 |
Java에서의 휘발성 vs 스태틱 (0) | 2022.08.07 |