用gdb调试getopt函数的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用gdb调试getopt函数的问题相关的知识,希望对你有一定的参考价值。

我正在使用此脚本从源代码构建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版本而不是某些隐藏的默认值?谢谢!

答案

我看到它带有自己的getopt,这对我有好处,因为我需要调试它:

既然你在Ubuntu上就不是这种情况了,请参阅随附的getopt.h:

// Only used in the win32-version of dnstracer.
// Supplied by Mike Black <mblack@csihq.com>

因此,您正在使用系统getopt,它是glibc的一部分。为了进入getopt,您需要安装glibc调试符号。有关如何在Ubuntu上调试glibc的信息,请参阅https://stackoverflow.com/a/48287761/72178

以上是关于用gdb调试getopt函数的问题的主要内容,如果未能解决你的问题,请参考以下文章

gdb调试中怎么查看其中一行的汇编代码

GDB 显示损坏的指令地址偏移

怎样用GDB调试core文件

GDB调试汇编堆栈过程分析

gdb调试程序函数名为问号,啥原因?

解决gdb 调试 core 文件函数名显示为问号的问题