使用 gdb 调试 getopt 函数时出现问题
problems debugging getopt function with gdb
我正在构建 dnstracer 应用程序来自源代码,使用此脚本:
#!/bin/bash
#########
# FILES #
#########
PACKAGE_NAME=dnstracer-1.6
PACKAGE_TAR_FILE=${PACKAGE_NAME}.tar.gz
PACKAGE_FTP_SITE=http://ftp.iij.ad.jp/pub/linux/momonga/1/PKGS/SOURCES/
####################################
# REMOVE OLD STUFF JUST TO BE SURE #
####################################
rm -rf build
rm -rf ${PACKAGE_NAME}
rm -rf ${PACKAGE_TAR_FILE}
#####################################
# Get source code for buggy package #
#####################################
wget ${PACKAGE_FTP_SITE}/${PACKAGE_TAR_FILE}
######################
# Unpack it here ... #
######################
tar xf ${PACKAGE_TAR_FILE}
##########################################
# Prepare an out of tree build directory #
##########################################
mkdir build
##############################
# Get inside build directory #
##############################
cd build
#################
# Configure ... #
#################
../${PACKAGE_NAME}/configure
###############
# Make it !!! #
###############
make -j
而且我看到它附带了它自己的 getopt,这对我来说很好,因为我需要调试它:
$ ls -l ./dnstracer-1.6/getopt.*
./dnstracer-1.6/getopt.c
./dnstracer-1.6/getopt.h
然而,当我尝试从 gdb 进入 getopt 时,我意识到它可能有一些其他的 getopt(可能没有调试符号?)并且它不允许我进入里面:
$ cd build
$ gdb --args ./dnstracer -v aaaaaa
$ (gdb) break main
$ (gdb) run
$ (gdb) next
$ 1304 while ((ch=getopt(argc,argv,"coq:r:s:t:v"))!=-1) {
$ step
$ 1305 switch (ch) {
如何将构建过程配置为使用随附的 getopt 版本而不是某些隐藏的默认版本?谢谢!
And I see it ships with its own getopt, which is good for me because I
need to debug it:
因为你在 Ubuntu 这不是你的情况,请参阅发货 getopt.h:
// Only used in the win32-version of dnstracer.
// Supplied by Mike Black <mblack@csihq.com>
因此您使用的系统 getopt
是 glibc 的一部分。为了进入 getopt
,您需要安装 glibc 调试符号。请参阅 了解如何在 Ubuntu 上调试 glibc。
我正在构建 dnstracer 应用程序来自源代码,使用此脚本:
#!/bin/bash
#########
# FILES #
#########
PACKAGE_NAME=dnstracer-1.6
PACKAGE_TAR_FILE=${PACKAGE_NAME}.tar.gz
PACKAGE_FTP_SITE=http://ftp.iij.ad.jp/pub/linux/momonga/1/PKGS/SOURCES/
####################################
# REMOVE OLD STUFF JUST TO BE SURE #
####################################
rm -rf build
rm -rf ${PACKAGE_NAME}
rm -rf ${PACKAGE_TAR_FILE}
#####################################
# Get source code for buggy package #
#####################################
wget ${PACKAGE_FTP_SITE}/${PACKAGE_TAR_FILE}
######################
# Unpack it here ... #
######################
tar xf ${PACKAGE_TAR_FILE}
##########################################
# Prepare an out of tree build directory #
##########################################
mkdir build
##############################
# Get inside build directory #
##############################
cd build
#################
# Configure ... #
#################
../${PACKAGE_NAME}/configure
###############
# Make it !!! #
###############
make -j
而且我看到它附带了它自己的 getopt,这对我来说很好,因为我需要调试它:
$ ls -l ./dnstracer-1.6/getopt.*
./dnstracer-1.6/getopt.c
./dnstracer-1.6/getopt.h
然而,当我尝试从 gdb 进入 getopt 时,我意识到它可能有一些其他的 getopt(可能没有调试符号?)并且它不允许我进入里面:
$ cd build
$ gdb --args ./dnstracer -v aaaaaa
$ (gdb) break main
$ (gdb) run
$ (gdb) next
$ 1304 while ((ch=getopt(argc,argv,"coq:r:s:t:v"))!=-1) {
$ step
$ 1305 switch (ch) {
如何将构建过程配置为使用随附的 getopt 版本而不是某些隐藏的默认版本?谢谢!
And I see it ships with its own getopt, which is good for me because I need to debug it:
因为你在 Ubuntu 这不是你的情况,请参阅发货 getopt.h:
// Only used in the win32-version of dnstracer.
// Supplied by Mike Black <mblack@csihq.com>
因此您使用的系统 getopt
是 glibc 的一部分。为了进入 getopt
,您需要安装 glibc 调试符号。请参阅 了解如何在 Ubuntu 上调试 glibc。