programing

LD_PRELOAD에서 gdb를 사용하는 방법

firstcheck 2022. 8. 7. 16:44
반응형

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

예리한 관찰자는 을 알아차릴 것이다.envAlexey Romanov의 답변과 같은 이그제큐티브 래퍼로서 기능합니다.

우리가 우연히 그런 사건에 부딪혔기 때문에 글을 올렸습니다.set environment동작하지 않음:

GDB 매뉴얼:

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

반응형